深入理解计算机系统LAB2

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

LAB1实验报告

实验目的:

使用课程知识拆除一个“Binary Bombs”来增强对程序的机器级表示、汇编语言、调试器和逆向工程等理解。

实验简介:

一个“Binary Bombs”(二进制炸弹,简称炸弹)是一个Linux可执行C程序,包含phase1~phase6共6个阶段。炸弹运行各阶段要求输入一个字符串,若输入符合程序预期,该阶段炸弹被“拆除”,否则“爆炸”。实验目标是你需要拆除尽可能多的炸弹。

运行结果:

通关密码储存在0014301-151420131.txt文件中。

成功运行结果截图:

实验中的六组密码:

PHASE1:字符串比较

本关比较简单,根据课件中的提示用GDB将最先压栈的那个字符串常量打印出来,然后将其作为密码输入,比较成功后即通关。

08048ab2 :

8048ab2: 83 ec 14 sub $0x14,%esp

8048ab5: 68 04 9f 04 08 push $0x8049f04

8048aba: ff 74 24 1c pushl 0x1c(%esp)

8048abe: e8 4d 04 00 00 call 8048f10 将地址0x8049f04中的值打印出来:

即“The future will be better tomorrow.”

PHASE2:循环

在查看汇编语言的时候,会看到有调用一个read_six_number函数,猜测此题是让输入六个数字。

08048ad3 :

8048ad3: 56 push %esi

8048ad4: 53 push %ebx

8048ad5: 83 ec 2c sub $0x2c,%esp

8048ad8: 8d 44 24 10 lea 0x10(%esp),%eax

8048adc: 50 push %eax

8048add: ff 74 24 3c pushl 0x3c(%esp)

8048ae1: e8 46 05 00 00 call 804902c

8048ae6: 83 c4 10 add $0x10,%esp

8048ae9: 83 7c 24 08 01 cmpl $0x1,0x8(%esp)------→判定是否为1 8048aee: 74 1e je 8048b0e

8048af0: e8 12 05 00 00 call 8049007

8048af5: eb 17 jmp 8048b0e

8048af7: 8b 03 mov (%ebx),%eax

8048af9: 01 c0 add %eax,%eax----→进行自加,扩大两倍 8048afb: 39 43 04 cmp %eax,0x4(%ebx)

8048afe: 74 05 je 8048b05

8048b00: e8 02 05 00 00 call 8049007

8048b05: 83 c3 04 add $0x4,%ebx

8048b08: 39 f3 cmp %esi,%ebx

8048b0a: 75 eb jne 8048af7

8048b0c: eb 0a jmp 8048b18

8048b0e: 8d 5c 24 08 lea 0x8(%esp),%ebx

8048b12: 8d 74 24 1c lea 0x1c(%esp),%esi

8048b16: eb df jmp 8048af7 →循环

8048b18: 83 c4 24 add $0x24,%esp

8048b1b: 5b pop %ebx

8048b1c: 5e pop %esi

8048b1d: c3 ret

有汇编语言进行分析,不难看出,这道题目要求输入六个数字,并且要求第一个数字为1,之后跳入一个循环,将第一个数字加倍和已有的数字进行比较,所以不难看出所需要的密码是1,2,4,8,16,32这六个数字。

PHASE3:条件分支语句

这道题的汇编语句明显变长了,但是由于PPT中已经提示这是条件分支语句,以此为切入点,此题也不难分析。

08048b1e :

8048b1e: 83 ec 1c sub $0x1c,%esp

8048b21: 8d 44 24 08 lea 0x8(%esp),%eax

8048b25: 50 push %eax

8048b26: 8d 44 24 10 lea 0x10(%esp),%eax

8048b2a: 50 push %eax

8048b2b: 68 0f a1 04 08 push $0x804a10f→打印该值为”%d%d”

8048b30: ff 74 24 2c pushl 0x2c(%esp)

8048b34: e8 87 fc ff ff call 80487c0 <__isoc99_sscanf@plt> 上面这一段调用了一个函数sscanf(),查询可知这个函数的原型为:int sscanf(const char *buffer,const char *format,[argument ]...);即读取输入的字符串,并以指定的格式赋给参数。其中一个参数在地址0x804a10f中。可知需要输入两个整数。

8048b39: 83 c4 10 add $0x10,%esp

8048b3c: 83 f8 01 cmp $0x1,%eax

8048b3f: 7f 05 jg 8048b46

8048b41: e8 c1 04 00 00 call 8049007

8048b46: 83 7c 24 0c 07 cmpl $0x7,0xc(%esp)---------→不大于7

8048b4b: 77 66 ja 8048bb3-→否则引爆有这些可以得知第一个参数的信息,可以看出这是一个不大于7的数,因此缩小了选择,不难猜出可能是分支条件。

8048b4d: 8b 44 24 0c mov 0xc(%esp),%eax

8048b51: ff 24 85 80 9f 04 08 jmp *0x8049f80(,%eax,4)

相关文档
最新文档