1.检查文件--》checksec 一下
查看之后发现是64位,直接放入IDA64进行反编译。
2.IDA反编译,进行分析
发现是gets()函数可以造成栈溢出,从而可以覆盖栈上的内容。
想法:通过gets函数(栈溢出)来篡改栈上的内容指令,从而达到控制指令,输出我们想要得到的内容(flag)。
大概思路:gets给s写入数据(一般是垃圾数据)一直到ebp并且覆盖ebp,然后将自己想要控制的指令输入,就可以获得控制权。
如何实现?
第一步:查看gets()参数离ebp的距离
跳转,查看参数的大小(离ebp的距离)
所以总的大小为0xF+0x8
第二步:将控制指令覆盖return的位置
在IDA中查看内容的时候,可以使用 shift+F12 进行全部内容的查看。
找到目标指令对应的函数的地址,我们将其覆盖return的地址就会调用其函数。
3.EXP
from pwn import *
io=remote("node4.buuoj.cn",29844)fun_addr=0x401186payload =b'a'*(0x8+0xF)
payload+= p64(fun_addr+1)io.sendline(payload)
io.interactive()
在靶机中,64位程序会进行栈平衡操作,所以要在覆盖return的代码+1.
作为新手时,不要求理解太多,有些东西先记着,等接触更多的方面才能理解。最基本的东西往往是最难得。