ciscn_2019_es_2的wp

32位,看看函数主体
ciscn_2019_es_2的wp_第1张图片
read函数0x30只能刚好覆盖ebp和ret。所以我们要用到栈迁移
栈迁移核心思想就是利用leave和ret转移ebp和esp。leave和ret常用于复原栈

leave=mov esp,ebp

pop ebp

ret=pop eip

首先我们泄露ebp的地址

ciscn_2019_es_2的wp_第2张图片
查看栈区
ciscn_2019_es_2的wp_第3张图片
偏移地址 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输入的内容
ciscn_2019_es_2的wp_第4张图片

你可能感兴趣的:(ciscn_2019_es_2的wp)