PicoCTF - Guessing Game 1
Background
ROP Chain Linux System Call Table for x86 64
Source code
:::spoiler
1 |
|
:::
Recon
- Recon
$ file vuln vuln: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=94924855c14a01a7b5b38d9ed368fba31dfd4f60, not stripped $ checksec vuln [*] '/mnt/d/NTU/CTF/PicoCTF/PWN/Guessing Game 1/vuln' Arch: amd64-64-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x400000)
可以看到這隻程式沒有用動態連結的方式引入library,代表他都把一些libc會用到的東西編譯進去了
- 這支程式沒有明顯讀flag的地方,所以可以直覺想到要開shell,而main function的do_stuff subfunction主要應該是類似proof of work的部分(因為亂數的範圍也只要0-99),當猜對random的數值後就近到win function然後可以填一些東西,達到bof的效果
- 所以也很直覺的想到one_gadget或是ROP chain的東西,這部分就比較傷腦筋,因為蓋的過程會有一點點繞,講白了這題和[^0x12_rop++]幾乎一模一樣,但因為太久沒看所以忘記了
- 既然有bof,那我們就可以隨便的蓋rop chain,包括syscall read function,這也說明了如何寫
/bin/sh\x00
的問題 - ==執行的順序:==
Guess random(PoW)$\to$
syscall __libc_read function$\to$
Input
/bin/sh\x00
$\to$ Return to main function$\to$ Guess random(PoW)$\to$ Syscallexecve
to get shell
Note: 要如何知道.bss
段在哪裡可以用readelf -S ./vuln
查看
Exploit
1 |
|
Reference
PicoCTF - Guessing Game 1 [Pwn] [^0x12_rop++]:Simple PWN - 0x12(Lab - rop++)