例题来自2017年的Backdoor CTF。程序的保护机制全部关闭,并且有权限RWX的段。
程序分析
首先可以看到_start()函数里有两个syscall。第一个是read(0, $rsp, 0x400)(调用号0x0),它从标准输入读取0x400个字节到rsp指向的内存,也就是栈上。第二个是sigreturn()(调用号0xf),它将从栈上读取sigreturn frame。所以我们就可以伪造一个frame。
flag其实就在二进制文件里,读取它需要一个write(1, &flag, 50)语句,调用号为0x1,而函数syscall()正好为我们提供了syscall指令,构造payload如下。