考察点
- 32系统调用
- 布置栈
注意题目源文件没有告诉函数名是write啥的,这些都是我自己改的名字,开启了什么保护就自己看咯
思路概要
- 利用程序自带的系统调用使eax=0xb(execve函数系统调用为b)
- 通过对栈进行布置,使ebx->‘/bin/sh’,ecx->0,edx->0
- 最后int 80h,拿到shell
程序分析
- 程序很简单,只有几个函数,没有plt,got,通过查看字符串也没有/bin/sh。
- 查看start函数得知,write输出了一个彩虹猫图案,buf是一个指针可写,指向.rodata段的数据(该段不可写)
3. main函数很简单,read向栈里面输入32h字节的内容,write输出"Good Luck!\n",不要想当然的以为直接就是直接覆盖ebp,eip就可以了
- 通过查看汇编代码,可知程序只是用的esp定位没有使用,ebp,其次该题目的栈空间不是那么常规,可以自己从start汇编开始画出栈执行变化,我这边提供现成的了,不过建议自己去弄,且这边write完执行下面的语句除了esp其他的值都变成deadbeef了。
具体思路
-
首先程序已有的函数没有使用plt,got所以无法泄露libc,且没有system函数和/bin/sh地址所以无法使用system获取shell。
-
程序具体函数都是通过系统调用实现的那么我们也可以通过系统调用execve函数获取shell,那么需要解决eax,ebx,ecx,edx这三个寄存器,使他满足execve调用
-
eax需要等于0xb,通过查看gadget和函数,我们发现只要执行完这个write 那么eax就等于0xb,这个问题就解决了