打开IDA观察,存在gets函数。并且有提示sub_40060D这个函数。
观察这个函数,可以发现,是查看flag的。到这里就能够确定思路了,利用gets函数修改返回地址到sub_40060D读取flag就可以了。
在这里可以看到,gets函数是用的v5指针,它的地址是rbp-40h.又因为是64位程序,所以需要再覆盖掉8个字节(返回地址前的那个栈帧),所以想要覆盖掉返回地址,需要40h+8h个字节的填充数据。
然后执行动态调试,验证一下IDA中显示的是否正确,在这里没法用 b main来设置断点,因此用地址形式下断点。
当程序执行完gets返回后,暂停观察。可以发现这里的gets返回调用函数后,并没有对栈进行操作,那么这个gets应该就不是cdcall,这样的话,现在的栈就是main函数的栈了。
在这里我输入的是一串0. 可以发现,输入的数据存放在了0xde70的地方,而栈底EBP在0xde30的地方。正好是40h。与IDA中显示的一致。
1 from pwn import * 2 io=remote('node3.buuoj.cn',27451) 3 #io=process('./warmup') 4 payload=b'A'*72+p64(0x40060D) 5 print(io.recv()) 6 io.sendline(payload) 7 print(io.recvline())
但是这里如果用本地文件打开的方式,会在第7行出现读取文件错误,原因不知。
然后我在BUUCTF网站上找到了相同的题目,就成功了。