这次是500分的rop
溢出很明显。但单看C代码,信息量太小,必须看汇编。
由于开了NX和ASLR,只能ROP了。由于在0x40056f
处有syscall
,所以我的思路是执行execve("/bin/sh",["/bin/sh",NULL],...)
具体地,我跳了好几次
- 溢出,返回再次
read
,而且把rbp
设到可写的0x601xxx
那里;
- 由于
rbp
在data
段,这次的read
,可以确定所写东西的地址。我们把第3次用到的栈上的数据写到这里。由于上次的rbp
可控,当执行完read
到leave;ret
时 ,我们让他跳到第3次read
- 这次是将字符串
/bin/sh
和地址写到固定地址。这样就把execve
的参数准备好了。这次结束后,返回到0x4005f6
- 通过一系列
mov ...
,把各个寄存器的值设好。然后返回0x4005e0
- 这里就通过设
rdx
等寄存器,call qword [r12+rbx*8]
来执行最终的execve
大体思路就是这样。然后比较麻烦的是,我不知道怎么与他交互……pwntool用不了,python还是不熟……于是最后用的是将flag文件拷贝一份为可读的……
下面是代码