Smashing The Stack For Fun And Profit.docx
- 文档编号:29155796
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:60
- 大小:35.79KB
Smashing The Stack For Fun And Profit.docx
《Smashing The Stack For Fun And Profit.docx》由会员分享,可在线阅读,更多相关《Smashing The Stack For Fun And Profit.docx(60页珍藏版)》请在冰豆网上搜索。
SmashingTheStackForFunAndProfit
.oOPhrack49Oo.
VolumeSeven,IssueForty-Nine
File14of16
BugTraq,r00t,andUnderground.Org
bringyou
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
SmashingTheStackForFunAndProfit
溢出堆栈的乐趣和意义
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
byAlephOne
aleph1@underground.org
`smashthestack`[Cprogramming]n.OnmanyCimplementations
itispossibletocorrupttheexecutionstackbywritingpast
theendofanarraydeclaredautoinaroutine.Codethatdoes
thisissaidtosmashthestack,andcancausereturnfromthe
routinetojumptoarandomaddress.Thiscanproducesomeof
themostinsidiousdata-dependentbugsknowntomankind.
Variantsincludetrashthestack,scribblethestack,mangle
thestack;thetermmungthestackisnotused,asthisis
neverdoneintentionally.Seespam;seealsoaliasbug,
fandangooncore,memoryleak,precedencelossage,overrunscrew.
Introduction
~~~~~~~~~~~~
Overthelastfewmonthstherehasbeenalargeincreaseofbuffer
overflowvulnerabilitiesbeingbothdiscoveredandexploited.Examples
ofthesearesyslog,splitvt,sendmail8.7.5,Linux/FreeBSDmount,Xt
library,at,etc.Thispaperattemptstoexplainwhatbufferoverflows
are,andhowtheirexploitswork.
{在过去的几个月里已经有大量增加的缓冲区
溢出漏洞被发现和利用。
例子
这些syslog,splitvtsendmail8.7.5,Linux/FreeBSD,Xt
图书馆,等。
本文试图解释缓冲区溢出
是,他们是如何工作的。
}
Basicknowledgeofassemblyisrequired.Anunderstandingofvirtual
memoryconcepts,andexperiencewithgdbareveryhelpfulbutnotnecessary.
WealsoassumeweareworkingwithanIntelx86CPU,andthattheoperating
systemisLinux.
{装配的基本知识是必需的。
了解虚拟
内存的概念,与gdb和经验非常有用但不是必要的。
我们还假设我们正在与Intelx86处理器,和操作
Linux系统。
}
Somebasicdefinitionsbeforewebegin:
Abufferissimplyacontiguous
blockofcomputermemorythatholdsmultipleinstancesofthesamedata
type.Cprogrammersnormallyassociatewiththewordbufferarrays.Most
commonly,characterarrays.Arrays,likeallvariablesinC,canbe
declaredeitherstaticordynamic.Staticvariablesareallocatedatload
timeonthedatasegment.Dynamicvariablesareallocatedatruntimeon
thestack.Tooverflowistoflow,orfilloverthetop,brims,orbounds.
Wewillconcernourselvesonlywiththeoverflowofdynamicbuffers,otherwise
knownasstack-basedbufferoverflows.
{我们开始前的一些基本定义:
缓冲区是一个连续的
计算机内存块拥有相同数据的多个实例
类型。
C程序员通常与这个词缓冲区数组。
大多数
通常,字符数组。
数组,像所有变量在C语言中,可以
声明静态或动态的。
静态变量分配负载
时间在数据段。
在运行时动态分配的变量
堆栈。
溢出流,或填补,边或界限。
我们将只关注动态缓冲区溢出,否则
被称为基于堆栈缓冲区溢出。
}
ProcessMemoryOrganization
进程内存的组织
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tounderstandwhatstackbuffersarewemustfirstunderstandhowa
processisorganizedinmemory.Processesaredividedintothreeregions:
Text,Data,andStack.Wewillconcentrateonthestackregion,butfirst
asmalloverviewoftheotherregionsisinorder.
{了解堆栈缓冲区,我们必须先了解
过程是组织在内存中。
流程分为三个区域:
文字、数据和堆栈。
我们将专注于堆栈区域,但第一
其他地区的一个小概述。
}
Thetextregionisfixedbytheprogramandincludescode(instructions)
andread-onlydata.Thisregioncorrespondstothetextsectionofthe
executablefile.Thisregionisnormallymarkedread-onlyandanyattemptto
writetoitwillresultinasegmentationviolation.
{文本区域是固定的程序,包括代码(指令)
和只读数据。
这一地区对应的文本部分
可执行文件。
这个地区通常是标记为只读,任何企图
写会导致分割违反。
}
Thedataregioncontainsinitializedanduninitializeddata.Static
variablesarestoredinthisregion.Thedataregioncorrespondstothe
data-bsssectionsoftheexecutablefile.Itssizecanbechangedwiththe
brk
(2)systemcall.Iftheexpansionofthebssdataortheuserstack
exhaustsavailablememory,theprocessisblockedandisrescheduledto
runagainwithalargermemoryspace.Newmemoryisaddedbetweenthedata
andstacksegments.
{数据区域包含初始化的和未初始化的数据。
静态
变量存储在这个地区。
区域对应的数据
data-bss部分的可执行文件。
它的大小可以被改变
brk
(2)系统调用。
如果bss的扩张数据或用户堆栈
耗尽可用内存,进程被阻塞,重新安排。
再次运行与一个更大的内存空间。
添加新的内存之间的数据
和堆栈段。
}
/------------------\lower
||memory
|Text|addresses
||
|------------------|
|(Initialized)|
|Data|
|(Uninitialized)|
|------------------|
||
|Stack|higher
||memory
\------------------/addresses
Fig.1ProcessMemoryRegions
经过特殊加工的内存数据
WhatIsAStack?
~~~~~~~~~~~~~~~~
Astackisanabstractdatatypefrequentlyusedincomputerscience.A
stackofobjectshasthepropertythatthelastobjectplacedonthestack
willbethefirstobjectremoved.Thispropertyiscommonlyreferredtoas
lastin,firstoutqueue,oraLIFO.
{堆栈是一个抽象数据类型经常用于计算机科学。
一个
堆对象属性,最后对象放在堆栈
将是第一个对象删除。
这个属性通常称为
后进先出队列,或后进先出。
}
Severaloperationsaredefinedonstacks.Twoofthemostimportantare
PUSHandPOP.PUSHaddsanelementatthetopofthestack.POP,in
contrast,reducesthestacksizebyonebyremovingthelastelementatthe
topofthestack.
{一些操作上定义堆栈。
最重要的两个
推动和流行。
推动在堆栈的顶部添加一个元素。
流行,
相反,减少了栈大小由一个通过删除最后一个元素
堆栈的顶部。
}
WhyDoWeUseAStack?
~~~~~~~~~~~~~~~~~~~~~~
Moderncomputersaredesignedwiththeneedofhigh-levellanguagesin
mind.Themostimportanttechniqueforstructuringprogramsintroducedby
high-levellanguagesistheprocedureorfunction.Fromonepointofview,a
procedurecallalterstheflowofcontroljustasajumpdoes,butunlikea
jump,whenfinishedperformingitstask,afunctionreturnscontroltothe
statementorinstructionfollowingthecall.Thishigh-levelabstraction
isimplementedwiththehelpofthestack.
{现代计算机设计与高级语言的需要
脑海中。
最重要的技术构建程序引入的
高级语言是过程或函数。
从一个角度看,一个
过程调用改变控制流就像跳,但不同
跳,完成执行任务时,函数返回控制的
语句或指令后调用。
这个高层的抽象
是栈的帮助下实现的。
}
Thestackisalsousedtodynamicallyallocatethelocalvariablesusedin
functions,topassparameterstothefunctions,andtoreturnvaluesfromthe
function.
{堆栈也用于动态地分配使用的局部变量
函数、向函数传递参数和返回值
功能}
TheStackRegion
~~~~~~~~~~~~~~~~
Astackisacontiguousblockofmemorycontainingdata.Aregistercalled
thestackpointer(SP)pointstothetopofthestack.Thebottomofthe
stackisatafixedaddress.Itssizeisdynamicallyadjustedbythekernel
atruntime.TheCPUimplementsinstructionstoPUSHontoandPOPoffofthe
stack.
Thestackconsistsoflogicalstackframesthatarepushedwhencallinga
functionandpoppedwhenreturning.Astackframecontainstheparametersto
afunction,itslocalvariables,andthedatanecessarytorecoverthe
previousstackframe,includingthevalueoftheinstructionpointeratthe
timeofthefunctioncall.
Dependingontheimplementationthestackwilleithergrowdown(towards
lowermemoryaddresses),orup.Inourexampleswe'lluseastackthatgrows
down.ThisisthewaythestackgrowsonmanycomputersincludingtheIntel,
Motorola,SPARCandMIPSprocessors.Thestackpointer(SP)isalso
implementationdependent.Itmaypointtothelastaddressonthestack,or
tothenextfreeavailableaddressafterthestack.Forourdiscussionwe'll
assumeitpointstothelastaddressonthestack.
{堆栈是一个连续的内存块,包含数据。
一个名为
堆栈指针(SP)指向堆栈的顶部。
的底部
堆栈是一个固定的地址。
它的大小是由内核的动态调整
在运行时。
CPU实现的指令来反推和流行的
堆栈。
堆栈包含逻辑推在调用堆栈帧
函数,返回时出现。
堆栈帧包含的参数
一个函数,它的局部变量,需要恢复的数据
以前的堆栈框架,包括指令指针的值
函数调用的时间。
根据实现堆栈要么向下生长(向
低内存地址),或。
在我们的示例中,我们将使用一个堆栈,生长
下来。
这是栈的方式生长在许多计算机包括英特尔、
摩托罗拉,SPARC和MIPS处理器。
堆栈指针(SP)也
实现依赖。
它可能指向栈上的最后一个地址,或
到下一个堆栈后免费可用的地址。
我们将为我们的讨论
假设它指向最后一个地址在堆栈上。
}
Inadditiontothestackpointer,whichpointstothetopofthestack
(lowestnumericaladdress),itisoftenconvenienttohaveaframepointer
(FP)whichpointstoafixedlocationwithinaframe.Sometextsalsorefer
toitasalocalbasepointer(LB).Inprinciple,localvariablescouldbe
referencedbygivingtheiroffsetsfromSP.However,aswordsarepushedonto
thestackandpoppedfromthestack,theseoffsetschange.Althoughinsome
casesthecompilercankeeptrackofthenumberofwordsonthestackand
thuscorrecttheoffsets,insomecasesitcannot,andinallcases
considerableadministrationisrequired.Futhermore,onsomemachines,such
asIntel-basedprocessors,accessingavariableataknowndistancefromSP
requiresmultipleinstructions.
除了堆栈指针,指向堆栈的顶部
(最低的数字地址),它通常是方便帧指针
(FP)指向一个固定的位置在一个框架。
一些文本也参考
它作为一个本地基本指针(磅)。
原则上,局部变量
引用从SP给他们补偿。
然而,作为单词被推进
堆栈和从栈中弹出,这些偏移量的变化。
尽管在一些
情况下,编译器可以跟踪堆栈和单词量
因此正确的偏移量,在某些情况下它不能,在所有情况下
相当大的管理是必需的。
此外,在一些机器,等
英特尔的处理器,访问一个变量在一个已知的距离SP
需要多个指令。
Consequently,manycompilersuseasecondregister,FP,forreferencing
bothlocalvariablesandparametersbecausetheirdistancesfromFPdo
notchangewithPUSHesandPOPs.OnIntelCPUs,BP(EBP)isusedforthis
purpose.OntheMotorolaCPUs,anyaddressregisterexceptA7(thestack
pointer)willdo.Becausethewayourstackgrows,actualparametershave
positiveoffsetsandlocalvariableshavenegativeoffsetsfromFP.
ThefirstthingaproceduremustdowhencalledissavethepreviousFP
(soitcanberestoredatprocedureexit).ThenitcopiesSPintoFPto
createthenewFP,andadvancesSPtoreservespaceforthelocalvariables.
Thiscodeiscalledtheprocedureprolog.Uponprocedureexit,thestack
mustbecleanedupagain,somethingcalledtheprocedureepilog.TheIntel
ENTERandLEAVEinstructionsandtheMotorolaLINKandUNLINKinstructions,
havebeenprovidedtodomostoftheprocedureprologandepilogwork
efficiently.过程称为时必须做的第一件事就是保存之前的《外交政策》
(这样,它可以在程序退出恢复)。
那么它将SP复制到《外交政策》
创建新的外交政策,提出SP保留空间的局部变量。
这段代码称为prolog程序。
在程序退出时,堆栈
必须清理,跋的过程。
英特尔
进入和离开指令和摩托罗拉的链接和分离指令,
已经提供给大多数过程序言和跋的工作吗
效率。
Letusseewhatthestacklookslikeinasimpleexample:
example1.c:
------------------------------------------------------------------------------
voidfunction(inta,intb,intc){
charbuffer1[5];
charbuffer2[10];
}
voidmain(){
function(1,2,3);
}
------------------------------------------------------------------------------
Tounderstandwhattheprogramdoestocallfunct
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Smashing The Stack For Fun And Profit