二进制炸弹 实验报告_第1页
二进制炸弹 实验报告_第2页
二进制炸弹 实验报告_第3页
二进制炸弹 实验报告_第4页
二进制炸弹 实验报告_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

二进制炸弹实验报告

一.实验目的:

通过二进制炸弹实验,熟悉汇编语言及其机器码表示,熟悉GDB调试工具。

二.实验简介:

这个实验是一个过关游戏,共有6关+一个隐藏关卡。在一台Linux服务器上有一个可执行的炸弹文件,运行它游戏就开始了。每一关都会要求你输入密码,只有密码正确才能通过,进入下一关,否则它会“爆炸”,每输入错误一次就会“爆炸”一次,服务器会记录你“爆炸”的次数,“爆炸”次数越多扣分越多。你所拥有的所有资源就是这个可执行的炸弹文件,你需要破译这个炸弹文件,从中找出每一关的过关密码,如果破译错误,你需要付出相应的代价。需要先进行反汇编并利用winscp工具,将反汇编代码下载到你的电脑上便于阅读。查看目标文件,并通过调试来得到每一关的密码。

三.具体过程:

第一关

通读phasel的代码后发现这是一个简单的比较过程,将我输入的字符串与存储于某个指定位置处的字符串进行比较:

8048cL3:c7442404

3c9a04

$OK0O49a3cj0k4(Wesp)

S04Scla:OS

8048clb:8b442420

JTirn.r

Ok20(%esp),%eas

0O4Bclf:B90424

nirn.r

%eax,(%esp)

S048c22:eS6d0400

00

call

S049094<strings_not_equal>

804BcS7:B5cO

test

%eas,如as

804Sc29:7405

SO4Sc3O<pha2e_l-K3z20>

8048c2b:e8£30900

00

call

8049623^exp1ode_bom.b)-

图1.1

于是使用gdb工具读取指定地址处存储的内容:

图1.2

便得到了第一关的密码为:Iamnotpartoftheproblem.IamaRepublican.

第二关

通读代码后发现,进行完push等准备工作后,程序调用了read_six_numbers函数来读入用户输入的六个十进制数并依次存放,两两之间的地址间隔为4。通读phase2的代码后发现这段代码进行的操作其实是比较输入数1与4是否相等,输入数2与5是否相等,输入数3与6是否相等,若有一对数不相等则引爆炸弹。

所以可以简单地输入ABCABC类型的数字串来拆除这一关的炸弹。

这一关我选择的密码是123123

第三关

第三关中用到了switch跳转语句。在这段代码中首先使用了scanf函数读入用户输入的

数据,读取$0x8049e0a中的内容可以得到“%d%d”,这就表明了这一关我们要输入的密码

是两个二进制数,

若输入的参数个数少于两个则引爆炸弹。

8048cab:c7

4424040a9e04嘿娱$0x8043eO0^4(%esp)

S048cb2:OS

SOdScbS:Sb

4424300s30(%esp),%eaK

S048cb7:89

0424mov%eax.(%esp)

SOdScba:e3

51fcffffcallS04SS10<isocSS2scarif@pLt>

U.M―...3_3..3_3人人如..—

图3.1

然后比较输入的第一个参数与7的大小关系,如果大于7则引爆炸弹:

8048cc9:837c241807

cijgl,$口£力0x18(%eap)

图3.2

接下来要做的事情就是找到switch的跳转表的起始位置,从代码中可以看到:

SO4ScdO:Sb4424IS题口皆OkISsp),

Qi血血:ff2485aO9a0408.和刖g加览魏4)

图3.3

所以调用gdb来查看这个位置中存储的内容,同时注意到循环变量%eax每次加一,所以寻找的地址每次加4,总共存在8个case,而且一个case执行完之后并不会break而是按照顺序进入下一个case直到全部执行完:

(ddto)D/凡*0KSC49aaCi

(jdto}p/x*Ox8C43aa4空q-9KE013cdb

(gdb}e/x*Ox8c^9aa:i

上三=9zE04Ece=

(gdTi)p/x*axBC49aaL:

Sn=门xFC4£l1=.=!

(gcib}f/a*0xSC49ab0

S7=3x£O43d06

(gdb}p/x*0K£C13ab4

£3=:JXIzU48dl2

(gdb>p/k*0s8C4^ab=

Em-OxEO^Sdlzi

((jdli)d/x*Ox8C49abc

-10-4)2cC04£d2aig业)■

图3.4

从后续的代码中可以得知每个case进行的都是简单的加或者减的操作。case表如下所示:

mov

$0x2cd,%eax

sub

$0k344,%eaz

8048cf3<phase_3-H)K5b>

mov

add

$0k15S,%eai?:

8048cff<phase_34OKS7>

mov

sub

$0k16c,%eaz

8048d0b<pliase_3-K)K73>

mov

$OkOj%as

,■.■,■.-X-'-Xv''.

add

$Osf%eaK

-VVi-tV-i

8048dl7<phase_3-H)K7f>

mov

sub

$0x202,%B3X

8048d23<phase_3-H)K8b>

mov

$OkOj矩as

add

$0x202,%eax

8048d2f<pliase_3-K)K97>

mov

%as

sub

$0x213,%eax

S04Sd40<phase_3-K)KaS>

图3.5

我选择输入的第一个参数为0,要经历所有的case,也就是将所有的加减数操作都进行一遍,最后得出的结果为-420。

所以这一关我选择的密码是:0-420

第四关

程序流程:

.读取参数,调用Sscanf函数传入参数

.比较输入参数与0的大小,小于等于则引爆

.把输入参数传入函数func4,并调用函数Func4

.若函数Func4返回值等于(0xa182584),则进入下一关,否则引爆炸弹

804Sda0:c74424040d9e04

SOiSdaY:OS

8048da8:8b442430

SOiSdac:S90424

8048daf:e85cfbffff

>!:iyl$0:<8049eOd.0k4i?X-esp.J

>ov0x30(%esp)s%eas

mov%eax,C%日mjj)

-TT-TT-T--i--,-T-TT-.TX

80489104sscanf

图4.2

通过读取0x8049e0d中的内容可知输入scanf函数的是一个十进制数字:

图4.2

尝试用C语言将Func4函数的功能表示出来:

intFunc4(inta)

{

if(a<=1)

return1;

intb=0;

for(intc=a;c>1;c-=2)

{

intd=c-1;

b+=Func4(d);

}

returnb+1;

}

可以看出来这是一个递归函数。通过从零开始对上述迭代进行依次求值,可以确定下来Func(17)=0xa18(2584)。

因此第四关的密码是:17

第五关

程序流程:

.调用string_length的字符串长度函数,测得的长度若不为6则引爆:

8048df8:

e87e020000

call

804907Lstring_length.)-

304Sdfd:

S3fS06

cup

®0k6,瘫sk

SO48eOO:

7405

8O4SeO7<phase_5-K)K2S>

SO48eO2:

e81c080000

ca.ll

8049623<eKplode_bonb>

图5.1

.做一个6次的循环,每次取出对应位的字符,截取其低四位:

8O48eO7:b800000000

S048e0c:Ofbe1403

80d8e10:83e2Of

8O4Sel3:Ofb692cO9a04OS

8048ela:88540415

ITlOV

movsbl

$0k0,%eazs

(%ebs,%eau,1)^%edn

andj%eis

movEolOxS049acO(%edx)%edxmov%dl,0x15(%espj%eaK,1)

J/口是线鼠的低四位

图5.2

.做一个6次的循环,每次取出对应位的字符,截取其低四位

.以输入的6个字符的ASCII码低四位为索引得到给出的字符串中的6个字符,存到一段连续的存储空间中

.比较索引得到的字符串是否为“titans”,如果不等则引爆炸弹,相等则炸弹拆除

图5.3

我们得到的作为参考用一一也就是索引表功能的字符串为isrveawhobpnutfg,而我们的目的字符串为titans,分别为13位,0位,13位,5位,11位和1位,所以只要我们输入的六个字符的相应的低四位的二进制表示为13,0,13,5,11,1即可。

所以这一关我选取的密码是:m0meka其中第二位是数字0。

第六关

程序流程:

.调用函数read_six_numbers,读入6个数字

.判断6个数字中是否存在大于6的数,如果存在则引爆炸弹

SOdBeTf:Bb44bd10

8048e83:83e801

niOT已口h

0x10C%e皿%B£i,4)j%eax$0k1,%eax

0O4BbS6:B3fS05

CIFLp

-v-v-.-v-.

8048e89:7S05

ibe

8048e90-<phase_6-H3s2£)■

0O48eSb:eS93070000

call

SO49G23GxpLcidjticimb,

图6.1

.判断6个数字两两之间是否有相等,如果存在相等则引爆炸弹

804Se9S:S9f3

B043e9a:Sb449c

10

ITluV

ITLUT

si,%ebs

0x10(眦皿%etix,4)

8048e9e:3944b4

Oc

CITLTI

%e:eg<.Oxcsb,%esi,4J

SO4Sea2:7505

jne

8048ea9<pha5e_6+0x4B)-

8048ea.4:e87a07

0000

call

8049S23Oxplodjbmb3

图6.2

.根据输入的参数找到索引的节点

.给相应的节点赋地址、赋值,并把节点依次串联起来

.判断前一节点的值是否不小于下一节点,如果不满足则则引爆炸弹

.炸弹拆除

(gdb}p/k*Oix&04cl74219=CixlbG

(gdb}p/k*Oix&04cl7cS-19=Cix&O4cl.5;O

(gdb}p/k*0ix&^4c1.5;^作2口=Oxldl

(gdb}p/k*0ix&^4c15e

-51=Ox&OlclSc(gdi>}p/x山=0x155(gdi>}p/xs-23=ax&01cl?.3(gdi>}pFk*ax&01cl?.3加3=OiKlSb

(gdi>}pFk*OiK&01cla.O5-25=OxSOlcle.1

(gdi>)p/k*ax&01cle.l5-26=Ok253

(gdi>)p/k*ax&01cle.c5.27=axE04clb0

(gdi>)p/k*axE04clb05.2.5=Ok12£(gdi»

这其实是一个链表,每个节点中存储了两个信息,第一个是该节点的存储的数字的值;第二个是该节点存储的指向下一个节点的地址;采用这样的方式将各个节点串接起来形成链表。调用gdb工具后可得各节点的数据依次是0x1b6、0x1d1、0x158、0x13b、0x253、0x12f。

所以按照从大到小的顺序排列便可得到第六关的密码是:521346

隐藏关卡

在读反编译代码的时候,发现在phase6后面还有一个名为secretphase的隐藏关卡。所以开始研究如何调出关卡。通篇代码读下来,发现只有在phase_defused函数的代码中调用了secretphase,而phase_defused是在每关成功拆除炸弹之后被调用的。

研究了phase_defused之后发现必须在调用sscanf函数的时候输入两个参数才有可能跳转到<secret_phase>。而sscanf只有在在第三、四关时被调用。而其中第三关答案已经要求了为两个参数,所以通向隐藏关卡的门只可能在第四关。程序调用了strings_not_equal函数来比较输入的第二个字符串的内容与其内部存储的某个字符串是否相等。

(gdb}p(chdrfr}0KE049el0

£30=0xE049el0门七d%sR

(gdb}p(char*-}0xB049el6

S31=Ox8049el€pra\istlnpowerspr

旧业}|

图7.1

可知需要在第四关的密码输入后再补充输入“austinpowers”才能进入隐藏关卡。

程序流程:

.调用Strtol函数,输入一个十进制数,判断其是否不大于0x3e9(1001)(无符号数),否则引爆炸弹

.把一个内部地址和该数传入Fun7,查看返回值是否为0,不等于则引爆炸弹

.炸弹拆除

Fun7函数流程:

.判断传入的第一个参数其地址内存储的值是否为0,若为0则返回-1

.判断参数1中存储的值和参数2是否相等,相等则返回0

.若参数2大于参数1中存储的值,则返回2*fu

温馨提示

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

评论

0/150

提交评论