沙箱基础学习
沙箱保护介绍沙箱保护用于限制程序的行为,防止攻击者通过漏洞执行任意代码或敏感系统调用(如execve)。最常见的是禁用一些系统调用,使得我们不能通过系统调用execve或system等获取到远程终端权限,因此只能通过rop链的方式调用orw(即为open**, read, **write)的来读取并打印flag 内容
一般有两种函数调用方式实现沙盒机制,第一种是采用prctl函数调用,第二种是使用seccomp库函数。
orw
open
int open(const char *pathname, int flags, mode_t mode);
第一个参数是文件路径,一般写’flag’即可
后面两个参数一般都设为0,0
read
ssize_t read(int fd, const void *buf, size_t count);
fd 是文件描述符,0标准输入,1标准输出,2标准错误, 3及更高的数字则表示打开的其他文件或资源。使用read函数打开flag文件,故fd=3
第二个参数是地址,将 flag`写入指定的内存地址中,这里是写在**.bss* ...
函数调用约定
Calling Conventions For Reverse Engineering
什么是函数调用约定函数调用约定(Calling Convention)是不同的编程语言或系统平台为函数调用所约定的规范。
主要决定了函数调用过程中参数如何传递、返回值如何传递、寄存器如何使用和保护,以及栈帧的管理方式。
prologue
prologue指的是函数开始部分的代码,用于准备函数的执行环境,设置栈空间和保存调用环境
保存ebp:保存调用者的ebp,以便在epilog中可以恢复。
设置栈指针:将栈指针调整为当前函数的栈框架,为局部变量预留空间。
分配栈空间:为函数的局部变量和栈上参数分配所需空间。
push ebpmov ebp, espsub esp, <stack_space>
在这个例子中:
push ebp:将调用者的基址寄存器ebp压入栈,以便在函数返回时恢复。
mov ebp, esp:将栈指针esp复制到基址寄存器ebp,创建一个新的栈帧基址。
sub esp, <stack_space>:从栈指针中减去一段空间,留给函数的局部变量。 ...