先看一下,,所有保护机制都开启了
进入main的第二个函数,里面是这一堆东西
查了一下这个是沙盒机制,seccomp ,,这个seccomp_rule_add函数是给这个沙盒添加规则,意思是这个函数不能调用
这个函数的第三个参数,是代表函数的number,,别的不太清楚,网上也没有查到。。但是 59号代表的是execve函数
所以这个函数不能被调用,,也就是说无法得到系统权限了(吧)
所以这样的话我们就只能执行shellcode 或者 通过open,read,write等函数想办法泄露出flag文件中的内容
(有兴趣的可以看一下pwnable.kr的asm,,里面也是禁用了系统调用,,通过编写shellcode用open,read,write三个函数泄露flag)
这是main函数里的第三个函数,
可以看到一开始打印出来了puts的真实地址,之后对buf进行输入,再之后 syscall(15,&buf)
syscall也是一个系统调用函数,第一个参数可以是很多数,效果不一样
但是第一个参数是15的时候代表调用的是sigreturn
首先看一下这两个图,这是进程在调用signal的时候的过程,调用signal类似于一个中断吧。。(我这么理解)
需要先把进程挂起,把进程当前的各个寄存器以及相关参数入栈,等到执行完signal的时候要考虑通过栈恢复当前的状态,
这时候就调用了syscall(15)也就是sigreturn函数,作用就是每个寄存器或者参数依次出栈,逐步恢复进程状态。。
但是这道题我们可以看到,没有调用signal,,直接就调用了syscall(15)也就是sigreturn函数,我们之前输入的buf被当作各种寄存器参数依次出栈
这个buf充当的角色叫做 Signal Frame ,在内存中的布局是这样的
这是 x64 下的布局,,第一个是sigreturn函数地址,,这个函数用于恢复进程状态,后面的参数一一对应出栈
x86 下的我没有找到图,但是有文字,各个寄存器储存的顺序,,因为x86下不用寄存器传参,所以SROP这种方法可能不好用吧。。
那么有了这些知识,我们就知道,通过输入buf,可以构造signal frame ,然后按我们的意愿构造进程状态,
而此时我们有puts函数的地址,可以知道libc里面的所有函数
我通过puts的地址查了一下libc