32位,看看函数主体
read函数0x30只能刚好覆盖ebp和ret。所以我们要用到栈迁移
栈迁移核心思想就是利用leave和ret转移ebp和esp。leave和ret常用于复原栈
leave=mov esp,ebp
pop ebp
ret=pop eip
首先我们泄露ebp的地址
查看栈区
偏移地址 0x118-0xe=0x38
esp指向了我们写入的system,接下来的ret就会使eip指向system函数。
ebp-0x38指向aaaa的地址。aaaa实际就是leave_ret后的ebp指向地址的内容,
可以起到定位的作用。因为接下来我们输入的leave_ret会使esp等于ebp后面的地址,
而此时ebp后面的地址是system。之后就能getshell了
顺便一提,接收printf返回的ebp前要先recv前面read输入的内容