migration
栈迁移其实就是利用 leave ret
因为 leave ret 实际上就是
1 | mov esp ebp |
简单来说,进行了两次的leave操作。(程序本身一次,你自己构造的一次)mov esp,ebp; pop ebp; mov esp,ebp; pop ebp。
第一次的leave操作将esp指向ebp基址,ebp指向栈中伪造的ebp处。
第二次的leave操作将esp指向伪造的ebp处(和汇编中开辟栈空间一样,ebp与esp先同时指向一个地方,然后填充(esp-4))最后的pop ebp会导致esp+4,所以我们需要构造的时候将数据放到esp+4的地方。
这是我手动进行的栈迁移,但是…不知道为什么,puts接收数据接收不到,望大佬指正
1 | from pwn import * |
ps:找到问题所在了,第一次需要send,sendline多了’\x0a’,好像就出现问题了
下面是利用rop模块进行的,这就可以了
1 | #!/usr/bin/env python |
spwn
这题,怎么说呢,学艺不精,在最后进行read读入的时候,我忘记加上leave_ret,将程序流劫持到read(addr)地方了。
1 | from pwn import * |
ciscn_2019_es_2
emmmmm,认真记录一次栈迁移,做了这题,发现对于栈迁移技术了解的还是不够透彻,故此详细记录两种打法。
先提出一点,不知道为什么,leak的ebp地址和调试过程中在栈空间覆盖ebp的地址差了0x10,也就是leak_ebp_addr - 0x10 = 栈空间ebp_addr
第一种
1 | from pwn import * |
第二种
1 | from pwn import * |