看一下保护:
Arch: i386-32-little
RELRO: No RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (0x8048000)
没有开的。
看一下汇编:
简单来说就是先输出一段字符串,再读一段字符串最后退出。读入的时候,buf 指向的的地址为 esp,buf 大小为 0x3C,可以覆盖到 _exit
上:
old esp
offset _exit <-- 只需要写 20 字节
':FTC'
' eht'
' tra'
'ts s'
2774654Ch <-- esp
因此我们可以把 shellcode 布局到栈上,然后做一个 ret2shellcode。
shellcode 就是简单的通过 sys_execve 系统调用执行 /bin/sh
方法啦。
接下来的问题是怎样才能找到 shellcode 的地址,我们可以泄露最开始 push 的 esp 的地址。
那么 crack 的流程为:
- 首先覆盖返回值为 0x08048087,这样在指行到返回地址的时候,esp 会加 0x14,指向的就是 old esp 了;
- 然后代码会输出 old esp 的值,再次进入读数据的阶段;
- 此时将 shellcode 写入,根据 esp 的偏移设置返回地址。注意到第二次 esp 又加了 0x14,因此我们需要在返回地址上也补充一个 0x14。
最终代码为:
技巧:
- 因为是 read,因此这里用 sendafter 系列函数就好;
- 为了避免
\x00
截断,我们可以先往栈上 push 一个值为 0 的寄存器
参考资料