小菜鸟想学溢出

1 view
Skip to first unread message

eversaylove

unread,
Dec 11, 2007, 12:35:10 AM12/11/07
to ph4nt0m, 12361629
由于是小菜,所以基础不过关,在看完王爽的《汇编语言》后,不自量力的开始了学习缓冲区溢出的知识,买了《网络渗透技术》开始学习。然而一开始就遇到了如此不解的问题。就在《网络渗透技术》第二章的simple_overflow.c这个讲述溢出入门的例子上,就开始困惑。
 
如图,abcd的确覆盖到了eip。但是为了深入了解,用OD加载了simple_overflow.exe。这里就是问题所在了,书中反编译后的代码非常简单,这个程序实现的功能本来就简单嘛。
PUSH EBP
MOV EBP,ESP
SUB ESP,10
PUSH simple_o.00406030
LEA EAX,DWORD PTR SS:[EBP-10]
PUSH EAX
CALL simple_o.00401020
ADD ESP,8
XOR EAX,EAX
MOV ESP,EBP
POP EBP
RETN
(照书上抄的,可能有个别小错,但总行数错不了)
可是在我自己的机器上OD显示的内容可就多了,抄起来太麻烦,我就截个图吧,
这还仅仅是一部分,全部内容直接要到004011E5,当然我们可以看到在0040111A的地方有个“SE处理程序安装”,百度了一下说是结构异常化处理,没能看明白。学习是一个循序渐进的过程,我想问可不可关掉这个功能,让我可以从基础学起,然后再来理解这些深入一点的东西呢?而且这多出来的近30行代码全部都是实现这个结构化异常处理功能的吗?是不是还有其他别的东西。《网络》一书中还有linux堆栈溢出的介绍,在我的fedora上用gdb调试的时候也是多出来一大堆。
编译器版本可以在图1中看到,vc++6.0,系统是xp+sp2的,最关键的是我用的cpu有两个核,在这种平台学习溢出和单核平台有什么差别吗(这个问题请务必讲解下)?
问题是很菜了,但还是希望幻影的牛牛们给指条明路吧,非常感谢。

eversaylove
2007-12-11
1.jpg
2.jpg

ph4nt0m.void

unread,
Dec 11, 2007, 12:56:35 AM12/11/07
to ph4...@googlegroups.com
1. 单/双核, 对于调试你说的这个溢出没影响.
2. 1) 你图里od指向的位置是PE启动Stub代码(编译器在生成PE的时候添加的),如果不想让编译器添加这些代码,可以在源文件头上加编译选项:
#pragma comment(linker, "/ENTRY:main")   //指定入口点为main.
2) 或者,你滚动od的CPU窗口到上面代码,就能看到main函数,然后在其上下断.
 
3. 先熟悉下od的使用和PE文件的格式(pediy.com看雪都有入门文章),要不然以后调试,会碰到更多麻烦.
 
4. 不懂gdb,这个得问刺牛.

王锐

unread,
Dec 11, 2007, 3:42:29 AM12/11/07
to ph4...@googlegroups.com
谢谢拉,明白了一些,但问题还是有的,为什么别人编译的时候没加#pragma comment(linker,"/ENTRY:main"),编出来的就正常,到我这里就不正常了,难道是我的环境在某个地方比较特殊。现在正好在fedora下,我把gdb调试的也贴出来。这里不管largebuffer有多大,eip依然不能覆盖,很是不明白。而且disas main后也很原文有些差别,是gcc版本不同导致的吗?后来从堆栈中弹出的eip为什么没有想象中的被AAAA覆盖呢?
刺头肯能注意不到我的菜文,注意到的牛牛都来给讲讲啊,我想幻影里总还是有人学要学习这西东西的,不只是给我一个人讲嘛。

在07-12-11,ph4nt0m.void <iliv...@gmail.com> 写道:



--
google一哈,你就晓得
0.png
1.png

zhen...@gmail.com

unread,
Dec 11, 2007, 6:36:19 AM12/11/07
to Ph4nt0m
vc是要这么指定的,别人比如用的dev-c就不需要#pragma


On Dec 11, 4:42 pm, "王锐" <eversayl...@gmail.com> wrote:
> 谢谢拉,明白了一些,但问题还是有的,为什么别人编译的时候没加#pragma
> comment(linker,"/ENTRY:main"),编出来的就正常,到我这里就不正常了,难道是我的环境在某个地方比较特殊。现在正好在fedor-a下,我把gdb调试的也贴出来。这里不管largebuffer有多大,eip依然不能覆盖,很是不明白。而且disas
> main后也很原文有些差别,是gcc版本不同导致的吗?后来从堆栈中弹出的eip为什么没有想象中的被AAAA覆盖呢?
> 刺头肯能注意不到我的菜文,注意到的牛牛都来给讲讲啊,我想幻影里总还是有人学要学习这西东西的,不只是给我一个人讲嘛。
>
> 在07-12-11,ph4nt0m.void <ilivev...@gmail.com> 写道:
>
>
>
> > 1. 单/双核, 对于调试你说的这个溢出没影响.
> > 2. 1) 你图里od指向的位置是PE启动Stub代码(编译器在生成PE的时候添加的),如果不想让编译器添加这些代码,可以在源文件头上加编译选项:
> > #pragma comment(linker, "/ENTRY:main") //指定入口点为main.
> > 2) 或者,你滚动od的CPU窗口到上面代码,就能看到main函数,然后在其上下断.
>
> > 3. 先熟悉下od的使用和PE文件的格式(pediy.com看雪都有入门文章),要不然以后调试,会碰到更多麻烦.
>
> > 4. 不懂gdb,这个得问刺牛.
>
> --
> google一哈,你就晓得
>
> 0.png
> 220KViewDownload
>
> 1.png
> 215KViewDownload

eversaylove

unread,
Dec 11, 2007, 9:15:30 AM12/11/07
to ph4...@googlegroups.com
谢谢ph4nt0m.void,确实生成了和原文中"差不多"的程序了吧,但这个程序确实无法调试的,不知道为什么,直接执行,eip的值并没有被覆盖,在OD中调试,一路F8过去,在call 0040102E处跳出main,直接执行到7c92EAF0处,再往后走几步就终止(7C9395F8)了,什么也看不到。
没了,貌似加了这#pragma以后,编译出来的正常程序也不能运行了

牛牛指条路啊,我真的要哭了
eversaylove
2007-12-11

1.jpg.JPG
2.jpg.JPG
3.jpg

jno

unread,
Dec 11, 2007, 9:45:54 AM12/11/07
to Ph4nt0m
我这里测试没有问题,你按照我的方法来一遍看看。

首先,到你od安装目录下的udd目录,把所有文件删除,清除od的cache。

第二,创建simple_overflow.c,内容如下:

#include <stdio.h>
#include <string.h>

#pragma comment(linker, "/ENTRY:main")

char largebuff[] = "1234512345123456====ABCD";

int main(void)
{
char smallbuff[16] = {0};
strcpy(smallbuff, largebuff);

return 0;
}

第三,编译cl simple_overflow.c

第四,od加载simple_overflow.exe,看到如下反汇编代码:

00401000 >/$ 55 push ebp
00401001 |. 8BEC mov ebp, esp
00401003 |. 83EC 10 sub esp, 10
00401006 |. C645 F0 00 mov byte ptr [ebp-10], 0
0040100A |. 33C0 xor eax, eax
0040100C |. 8945 F1 mov [ebp-F], eax
0040100F |. 8945 F5 mov [ebp-B], eax
00401012 |. 8945 F9 mov [ebp-7], eax
00401015 |. 66:8945 FD mov [ebp-3], ax
00401019 |. 8845 FF mov [ebp-1], al
0040101C |. 68 00204000 push
00402000 ; ASCII "1234512345123456====ABCD"
00401021 |. 8D4D F0 lea ecx, [ebp-10]
00401024 |. 51 push ecx
00401025 |. E8 16000000 call 00401040
0040102A |. 83C4 08 add esp, 8
0040102D |. 33C0 xor eax, eax
0040102F |. 8BE5 mov esp, ebp
00401031 |. 5D pop ebp
00401032 \. C3 retn

f8单步执行,一直走到call那行打住,观察下堆栈窗口:

0012FFA8 0012FFB0
0012FFAC 00402000 ASCII "1234512345123456====ABCD"

这里是strcpy函数的两个参数,下面这个是largebuff,上面那个则是smallbuff,再仔细观察下它0012FFB0,发现它是个指
针,指向栈内存,观察堆栈窗口:

0012FFB0 00000000
0012FFB4 00000000
0012FFB8 00000000
0012FFBC 00000000
0012FFC0 0012FFF0
0012FFC4 7C816FD7 返回到 kernel32.7C816FD7

发现0012FFB0距离0012FFC4一共6*4=24个字节,也就是说largebuff的内容覆盖过来的话,ABCD正好回覆盖
0012FFC4的那四个字节,你也看到了,这个地方是一个返回地址。继续单步到ret打住,观察堆栈窗口:

0012FFC4 44434241

这里栈顶是44434241,不就是DCBA么,f7单步执行ret,那么下一句的ret指令就会把栈顶的44434241作为eip继续执行程序,于
是成功控制eip,这时候代码窗口啥都没有了,因为44434241地址未影射的内存。观察一下寄存器窗口会发现

EIP 44434241

到此,这个溢出成功。

seven

unread,
Dec 11, 2007, 7:35:50 PM12/11/07
to Ph4nt0m
我再给你推荐一本书,黑客x档案的《黑客编程入门2》,里面有溢出的详细介绍。还有代码。可以辅助你理解。

Docoocoo

unread,
Dec 11, 2007, 7:50:14 PM12/11/07
to ph4...@googlegroups.com
《Q版黑客——缓冲区溢出教程》
这本书还可以 
讲的比较清楚,由浅入深

 
在07-12-12,seven <netmas...@126.com> 写道:

eversaylove

unread,
Dec 12, 2007, 1:17:19 AM12/12/07
to ph4...@googlegroups.com
非常感谢jno和ph4nt0m.void两位大哥的帮助,你们让我觉得自己的电脑还算是个正常的东西,呵呵。按两位所说的,我成功调出了jno给的那段代码。理解了这个简单的溢出过程。我想以后的学习过程中还会遇到很多问题,希望各位大牛们不吝赐教,多谢了。
关于seven,Docoocoo两位大哥说的《黑客编程入门2》和《Q版黑客-缓冲区溢出教程》,这里我无意冒犯,只是客观的说一下,我觉得安焦出的《网络渗透技术》所写应该更好才对啊。只是这本书对我来说确实比较深了,如果两位大哥提到的两本书看过后可以对我看《网络渗透技术》有所帮助的话,我马上就去买,呵呵。如果没有,看来又只有对着寄存器彻夜不眠了,唉.........
总之,谢谢各位幻影的朋友了。

eversaylove
2007-12-12

发件人: jno
发送时间: 2007-12-11 22:46:12
收件人: Ph4nt0m
抄送:
主题: [Ph4nt0m] Re: 小菜鸟想学溢出

Docoocoo

unread,
Dec 12, 2007, 2:06:16 AM12/12/07
to ph4...@googlegroups.com
《黑客编程入门2》没看过,不大清楚。
没人说《Q版黑客-缓冲区溢出教程》与《网络渗透技术》哪个好哪个差,只是看适合谁了。
《网络渗透技术》讲的比较深,涵盖比较全;但是有些基础的东西会略去不提;
《Q版黑客-缓冲区溢出教程》只限于Windows操作系统,漏洞利用的各个方面都提到了,而且包含一些操作上的技巧之类的内容;比《网络渗透技术》便宜,书加光盘16.00元!!

在07-12-12,eversaylove <evers...@gmail.com> 写道:

seven

unread,
Dec 13, 2007, 7:40:22 PM12/13/07
to Ph4nt0m
《网络渗透技术》这本书肯定是非常棒了。安焦的作品吗?我只是提供一个辅助的书本,不是比长比短。
黑客编程2里介绍了几篇现在比较流行的activex的溢出。通过javascript。虽然原理都是一样的。但是比较贴近现在,浅显易懂。
当然技术上,肯定没有网络渗透技术里面讲解的全了。而且溢出的章节也不是太多。
我喜欢《黑客编程2》是因为它比较适合菜鸟。高手可以飘过。

On Dec 12, 2:17 pm, "eversaylove" <eversayl...@gmail.com> wrote:
> 非常感谢jno和ph4nt0m.void两位大哥的帮助,你们让我觉得自己的电脑还算是个正常的东西,呵呵。按两位所说的,我成功调出了jno给的那段代码。理解了这个简单的溢出过程。我想以后的学习过程中还会遇到很多问题,希望各位大牛们不吝赐教,多谢了。
> 关于seven,Docoocoo两位大哥说的《黑客编程入门2》和《Q版黑客-缓冲区溢出教程》,这里我无意冒犯,只是客观的说一下,我觉得安焦出的《网络渗透技术》所写应该更好才对啊。只是这本书对我来说确实比较深了,如果两位大哥提到的两本书看过后可以对我看《网络渗透技术》有所帮助的话,我马上就去买,呵呵。如果没有,看来又只有对着寄存器彻夜不眠了,唉.........
> 总之,谢谢各位幻影的朋友了。
>
> eversaylove
> 2007-12-12

networker networker

unread,
Dec 14, 2007, 12:33:54 AM12/14/07
to ph4...@googlegroups.com
nop大牛

在07-12-11,ph4nt0m.void <iliv...@gmail.com> 写道:
Reply all
Reply to author
Forward
0 new messages