花了将近一天半的时间研究这一题,因为最近在熟练srop技术,所以在看到pwnbale.kr上的那道unexploitable之后,想趁热打铁来试试这道500p的题目。收货颇丰啊~~~ 虽然看了网上的思路,但exp还是自己搞了出来,还是有点小小成就感。
题目的二进制文件和libc自己去网站上找吧pwnable.tw.
首先拿到题目我们看到没有了syscall,变为了call read,这个变化导致题目直接上了一个档次。使我们的思路陷入死活同:我们需要调用system(’/bin/sh’)的话,需要先泄露libc,但是程序本身没有输出函数,我们又只能通过系统调用来调用write等函数,可是又没有syscall;或者我们需要调用execve(‘/bin/sh’),仍然需要syscall来触发。也就是说没有syscall我们什么都干不了。。。。
- 这个时候就需要独特的思路和脑洞。。。这也是为什么值500p的原因。。。。我们动态调试read函数内部会发现其第三条语句就是syscall,而且read()和syscall只有的LSB(最后一个有效字节)不相等!!如果先将read()的LSB改为syscall的LSB,再搭配64位通用gadgets,call [read_got]就等于jmp syscall。我们获得了syscall。
- 之后思路分为:
- 先利用 pop rbp; ret; 和 leave; ret; 来劫持栈到我们选定的bss段(实际上是加载后的空闲段)。
- 然后用64位通用gadgets来改写read()的LSB(这一步过后就没法调用read()了,所以我们得用其他函数来控制rax)