深入理解计算机系统LAB2
更新时间:2023-10-06 11:47:01 阅读量: 综合文库 文档下载
LAB1实验报告
实验目的:
使用课程知识拆除一个“Binary Bombs”来增强对程序的机器级表示、汇编语言、调试器和逆向工程等理解。
实验简介:
一个“Binary Bombs”(二进制炸弹,简称炸弹)是一个Linux可执行C程
序,包含phase1~phase6共6个阶段。炸弹运行各阶段要求输入一个字符串,若输入符合程序预期,该阶段炸弹被“拆除”,否则“爆炸”。实验目标是你需要拆除尽可能多的炸弹。
运行结果:
成功运行结果截图:
通关密码储存在0014301-151420131.txt文件中。
实验中的六组密码:
PHASE1:字符串比较
本关比较简单,根据课件中的提示用GDB将最先压栈的那个字符串常量打印
出来,然后将其作为密码输入,比较成功后即通关。
08048ab2
8048ab2: 83 ec 14 8048ab5: 68 04 9f 04 08 8048aba: ff 74 24 1c 8048abe: e8 4d 04 00 00
sub $0x14,%esp push $0x8049f04 pushl 0x1c(%esp)
call 8048f10
将地址0x8049f04中的值打印出来:
PHASE2:循环
在查看汇编语言的时候,会看到有调用一个read_six_number函数,猜测此即“The future will be better tomorrow.”
题是让输入六个数字。
08048ad3
8048ad3: 56 8048ad4: 53 8048ad5: 83 ec 2c 8048ad8: 8d 44 24 10 8048adc: 50 8048add: ff 74 24 3c 8048ae1: e8 46 05 00 00 8048ae6: 83 c4 10 8048ae9: 83 7c 24 08 01 8048aee: 74 1e 8048af0: e8 12 05 00 00 8048af5: eb 17 8048af7: 8b 03 8048af9: 01 c0 8048afb: 39 43 04 8048afe: 74 05 8048b00: e8 02 05 00 00 8048b05: 83 c3 04 8048b08: 39 f3 8048b0a: 75 eb 8048b0c: eb 0a
push %esi push ?x
sub $0x2c,%esp
lea 0x10(%esp),êx push êx
pushl 0x3c(%esp)
call 804902c
cmpl $0x1,0x8(%esp)------?判定是否为1 je 8048b0e
add êx,êx----?进行自加,扩大两倍 cmp êx,0x4(?x)
je 8048b05
jne 8048af7
8048b0e: 8048b12: 8048b16: 8048b18: 8048b1b: 8048b1c: 8048b1d: 8d 5c 24 08 8d 74 24 1c eb df 83 c4 24 5b 5e c3 lea 0x8(%esp),?x lea 0x1c(%esp),%esi
jmp 8048af7
有汇编语言进行分析,不难看出,这道题目要求输入六个数字,并且要求第
一个数字为1,之后跳入一个循环,将第一个数字加倍和已有的数字进行比较,所以不难看出所需要的密码是1,2,4,8,16,32这六个数字。
PHASE3:条件分支语句
这道题的汇编语句明显变长了,但是由于PPT中已经提示这是条件分支语句,
以此为切入点,此题也不难分析。
08048b1e
8048b1e: 83 ec 1c 8048b21: 8d 44 24 08 8048b25: 50 8048b26: 8d 44 24 10 8048b2a: 50
sub $0x1c,%esp lea 0x8(%esp),êx push êx
lea 0x10(%esp),êx push êx
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: 8048b3c: 8048b3f: 8048b41: 8048b46: 8048b4b:
83 c4 10 83 f8 01 7f 05 e8 c1 04 00 00 83 7c 24 0c 07 77 66
add $0x10,%esp cmp $0x1,êx
jg 8048b46
cmpl $0x7,0xc(%esp)---------?不大于7 ja 8048bb3
有这些可以得知第一个参数的信息,可以看出这是一个不大于7的数,因此
缩小了选择,不难猜出可能是分支条件。
8048b4d: 8b 44 24 0c mov 0xc(%esp),êx
8048b51: ff 24 85 80 9f 04 08 jmp *0x8049f80(,êx,4)
8048b58: 8048b5d: 8048b5f: 8048b64: 8048b69: 8048b6b: 8048b70: 8048b75: 8048b77: 8048b7c: 8048b81: 8048b83: 8048b88: 8048b8d: 8048b8f: 8048b94: 8048b99: 8048b9b: 8048ba0: 8048ba5: 8048ba7: 8048bac: 8048bb1: 8048bb3: b8 0c 03 00 00 eb 05 b8 00 00 00 00 2d d5 03 00 00 eb 05 b8 00 00 00 00 05 35 01 00 00 eb 05 b8 00 00 00 00 2d e9 02 00 00 eb 05 b8 00 00 00 00 05 e9 02 00 00 eb 05 b8 00 00 00 00 2d e9 02 00 00 eb 05 b8 00 00 00 00 05 e9 02 00 00 eb 05 b8 00 00 00 00 2d e9 02 00 00 eb 0a e8 4f 04 00 00 mov $0x30c,êx
jmp 8048b64
jmp 8048b70
jmp 8048b7c
jmp 8048b88
jmp 8048b94
jmp 8048ba0
jmp 8048bac
jmp 8048bbd
上面是各种分支情况,看起来比较复杂,先放一放
b8 00 00 00 00 83 7c 24 0c 05 7f 06 3b 44 24 08 74 05 e8 38 04 00 00 83 c4 1c c3
mov $0x0,êx
cmpl $0x5,0xc(%esp)---?参数不能大于5 jg 8048bca
je 8048bcf
8048bb8: 8048bbd: 8048bc2: 8048bc4: 8048bc8: 8048bca: 8048bcf: 8048bd2:
可以看出参数不能大于五,因此这道题可能有多组解,不过结合分支语句,
不难看出当第一个参数比较大的时候,计算量比较小,所以我选择了第一个参数为5,代入进行逐步计算,可以得到此时的值为-745。
PHASE4:递归调用栈
这一步是递归调用栈,所以有两部分汇编代码,其中一个是被调用的函数,
简单地看一下代码,应该是一个递归的函数。先分析主程序部分的代码,其中也
有sscanf函数:
08048c2c
8048c2c: 83 ec 1c 8048c2f: 8d 44 24 08 8048c33: 50 8048c34: 8d 44 24 10 8048c38: 50
sub $0x1c,%esp lea 0x8(%esp),êx push êx
lea 0x10(%esp),êx push êx
8048c39: 68 0f a1 04 08 push $0x804a10f---?输出为”%d%d” 8048c3e: 8048c42: 8048c47: 8048c4a:
ff 74 24 2c e8 79 fb ff ff 83 c4 10 83 f8 02
pushl 0x2c(%esp)
call 80487c0 <__isoc99_sscanf@plt> add $0x10,%esp
cmp $0x2,êx----?返回值为2
从上面这部分看出我们需要输入两个参数,且两个都是整数型的。
75 07 83 7c 24 0c 0e 76 05 e8 ac 03 00 00 83 ec 04 6a 0e 6a 00 ff 74 24 18 e8 68 ff ff ff 83 c4 10 83 f8 25 75 07 83 7c 24 08 25 74 05 e8 88 03 00 00 83 c4 1c c3
jne 8048c56
cmpl $0xe,0xc(%esp)?第一个参数不大于14 jbe 8048c5b
pushl 0x18(%esp)
call 8048bd3
jne 8048c7a
cmpl $0x25,0x8(%esp)---?第二个参数为37 je 8048c7f
8048c4d: 8048c4f: 8048c54: 8048c56: 8048c5b: 8048c5e: 8048c60: 8048c62: 8048c66: 8048c6b: 8048c6e: 8048c71: 8048c73: 8048c78: 8048c7a: 8048c7f: 8048c82:
从上面这些可以看出,虽然输入了两个参数,但是只有第一个参数被传递给
了func4另外一个没有变化,而且可以知道等于37。同时,第一个参数还不大于14。这样可能的情况就少了。考虑到func4本来就是一个递归函数,即使反汇编出来,也需要一步一步代入,不如直接进行尝试,枚举法得到第一个参数是10。
PHASE5:指针
这一道题的提示比较模糊,毕竟汇编程序里到处都有指针。
正在阅读:
深入理解计算机系统LAB210-06
初中地理图像教学策略研究报告03-17
2018年中国燃气汽车现状研究及发展趋势预测(目录) - 图文10-06
六年级数学下册 总复习人教版03-15
CMMI(预)评估PM问卷06-06
共享经济的利与弊作文600字07-14
五年级数学上册课时同步检测试题1312-29
磁场竞赛辅导讲义04-13
第一次做沙包作文500字07-08
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 深入
- 理解
- 计算机
- 系统
- LAB2
- 过程控制复习资料 - 图文
- 2017年10月全国自考《财务管理学》试题及答案 - 图文
- 水溶性和油溶性银纳米粒子的制备与表征
- 高中语文新课程·高中语文必修与选修课的设置 - 图文
- 社会心理学练习:自我意识
- matlab软件仿真实验(信号与系统)
- 财务报表分析 综合练习题(答案参考) - 图文
- 02-13湖南大学材料力学考研真题全集 - 图文
- 高炉炼铁工考试计算题
- 2011年八年级地理复习导学案1 - 图文
- 东财《审计学概论》在线作业一
- 山西霍州义城村的传说 - 图文
- SNCR烟气脱硝工艺简介 - 图文
- 防水工程作业指导书
- 教育心理学 第三章学习实质 - 图文
- 浅谈古代中印文化交流
- 《00067 财务管理学》练习题参考答案
- linux系统安全加固规范
- 《财务会计学》期末复习 - 有答案AAA客观题1
- 体育公开课观后感