深入理解计算机系统LAB2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
即“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
8048b4d: 8b 44 24 0c mov 0xc(%esp),%eax
8048b51: ff 24 85 80 9f 04 08 jmp *0x8049f80(,%eax,4)