逻辑复杂利用简单的pwn
遇到了一道坑有很多的题,记录一下。题目:forgot,题目地址:forgot
首先查看安全策略
不是很高,就一个NX,看看代码逻辑吧,直觉告诉我并不简单:
一张图放不下,其实有溢出,但我由于主函数太长了还一堆小函数,没注意(吓到了)。中间switch之中的一堆小函数都是判断是不是字母、数字、下划线之类的,比如:
而且最后有个调用:
调用的值又和v14有关,导致我没有最开始仔细分析如何调用而去分析上面那个switch的逻辑了,其实就是根据用户输入的字符串的格式不同给v14赋不同的值。完整的逻辑是一个类似邮箱的字符串cat@cat.com这种,就会让v14值为10,其他的根据完整成都值不同。最后调用V3+v14-1这个地址。在上面代码中可以看出,v3-v12都在最开始赋了一个函数,都是一些输出字符串的函数。 这里看反汇编代码不好明白这个是怎么计算的,直接看汇编代码:
将v14-1,然后调用v3变量下面v14值对应的变量指向的函数。由于小函数实在太多,我没有一个一个去看,通过string表发现了一个函数:
函数有了,然后发现逻辑只要我们输入的字符串前面是小写字母并且之中没有@,那么v14的值就一直是2,最后减1编程1,最后调用的就是v4,溢出点在:
计算v2和v4的相对位移,然后覆盖就好,具体看exp:
from pwn import *
p=process("./3d000793d15b444ab46e99e165e9454b")
flag_addr=0x80486CC
payload='a'*0x24+p32(flag_addr)
print p.recv()
p.sendline("chen")
print p.recv()
p.sendline(payload)
print p.recv()
可谓一顿操作猛如虎,一看溢出一步走!