计算机系统原理 课程实验报告
实验题目:ARM汇编指令
实验学时:16 实验日期:2019.04.04
实验目的:
① 熟悉ARM汇编指令集,能够阅读与调试汇编代码。
② 学会并理解可执行文件的反编译过程。
③ 进一步认识汇编语言在硬件层面的执行。
④ 对代码的编译执行层面有更深刻的认识。
硬件环境
:实验室PC、笔记本电脑
软件环境
:Linux下的qemu模拟器+树莓派系统,
实验步骤与内容:
1, ## 环境安装与配置
在Linux操作系统下安装Qemu并在模拟器上搭建ARM模拟环境。
2, 反编译可执行文件与gdb调试
我们通过使用objdump –d命令反编译得到.s文件并通过gdb调试一步步探索题目的解决方案。通过阅读反编译得到的.s文件。bomb汇编程序由以下几部分构成,分别是:,<explode_bomb>,<read_line>,<phase_1>,…,<phase_7>,<strings_not_equal>,<read_six_numbers>, 等。这对下面调试破解的进行提供了依据。
3,关卡破解
该实验总计7个关卡,在我们各自具备独立完成前四个实验之后。5,6,7关卡内容通过合力合作分析完成关卡内容理解,最后分工阐释7个关卡的破解机理。分工如下:
分析
下面便按关卡顺序进行阐释
Phase_1
我们在Phase_1处设置断点以观察每条指令执行的过程
首先我们观察两处炸弹爆炸的地方,
在第一处cmp命令处,我们比较了r3寄存器中的值与1的大小,同时在前两处的str与ldr命令中,我们将r0处的值给了r3。
往前查看
在bl命令执行之前 我们打出r0,r1,r2,r3的值
而在bl执行完成后
r0的值为1
根据sscanf函数,我们猜测r0,r1中为sscanf的两个参数,最后r0为该函数的返回值。
此处暂且不表,我们继续检查第二个炸弹爆炸处。
此处将(r11-12)处的值给了r3,并将此值进行比较,
我们将r3的值打印出来,即可发现r3为我们输入的int整数。(输入14
所以此处应为比较输入的值和188是否相等。
输入188
炸弹拆除成功,我们验证之前关于sscanf处的猜测,我们此次输入“188 14”两个数,在执行到bl处,依然可以发现,并且炸弹拆除成功
而输入空字符串则r0返回错误值
所以在Phase_1中sscanf函数大概为 。在读入后返回
至此我们拆除了第一个炸弹。
其大概为判断读入的int值是否为188.
Phase_2
依然将断点设置在phase_2