实验资料:
https://wwpv.lanzoue.com/b05drr8qh
密码:6wjx
计算机组成原理实验三 修改二进制文件的程序改变最终运行结果
复习实验二GCC选项:-E -S -c -o -v
.\gcc.exe 1.c -> a.exe .\gcc.exe 1.c -o 21001302xx.exe
(1) 使用objdump.exe -d obj.exe 打印出反汇编内容,可以使用重定向将屏幕打印的内容输出到文本后,再分析。
(2) objdump.exe -x obj.exe:以某种分类信息的形式把目标文件的数据组成输出;<可查到该文件的的所有动态库>
objdump.exe -t obj.exe:输出目标文件的符号表()
objdump.exe -h obj.exe:输出目标文件的所有段概括()
objdump.exe -S obj:输出指定段的信息(反汇编源代码) 【注意当gcc -g编译后才能生效】
-S 尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时, 效果比较明显。隐含了-d参数。
-l 用文件名和行号标注相应的目标代码,仅仅和-d、-D或者-r一起使用 使用-ld和使用-d的区别不是很大,在源码级调试的时候有用,要求 编译时使用了-g之类的调试编译选项。
详细可参考 objdump命令
例:(1)编译命令:.\gcc.exe -g 1.c -o .\1.exe
(2)反汇编命令: .\objdump.exe -S .\1.exe
- 通过编写下面C语言程序,通过objdump.exe工具查看global以及local变量所在的地址(截图),并生成反汇编以及带源码的反汇编文件(截图)。
#include<stdio.h>
int global = 0x88888888; 全局变量
int main()
{
int local = 0x66666666; 局部变量 栈
int i,sum=0;
for(i=1; i<=local;i++)
{
sum += i;
}
printf("%d\n",sum);
return 0;
}
注释:
第一小问:
先创建含有题目代码的文件,然后从终端执行指令gcc -g xxx.c -o xxx.exe objdump -s xxx.exe > xxx.txt
执行完指令后即可看到 xxx.txt 了,然后用记事本打开该文件
再搜索(快捷键 Ctrl + F)“88888888”,最前面的那个就是全局变量地址了
再搜索(快捷键 Ctrl + F)“66666666”,最前面的那个就是局部变量地址了
第二小问:
在终端执行指令objdump -S xxx.exe > xxx.txt
执行完指令后即可看到 xxx.txt 了,该文件便是所需要的反汇编文件了
截图参考:
- 下载附件中的“2100130499VIP.exe”。安装并使用ultraEdit软件,强制将修改文件中的if…else分支语句,将”2100130499普通会员”修改成“你自己的学号VIP”,并截图在ultraEdit软件修改的部分(用红色框框定),以及在DOS中修改前1次及修改后2次的运行截图。
附件: 2100130499VIP.exe
要求:尽量多的说明你修改的方法,并对修改细节进行截图:
答:先在用UltraEdit打开2100130499VIP.exe文件,由于字符串的存储方式是ASCⅡ,直接搜索(快捷键 Ctrl + F)2100130499,然后修改为 “自己的学号”。
再搜索字符串2100130499common,将其修改为 “自己的学号 + VIP” 后面的三个字符修改为0,然后就修改完成了。
- 下载附件中的“3-2.exe”(可参考objdump -S的部分反汇编出源代码文件 3-2-g-part.txt)。安装并使用ultraEdit软件,强制将修改文件中的某些数值或者分支语句。
附件:3-2.exe、3-2-g-part.txt
要求:
(1) 要求能小于等于13轮击败敌人。尽量多的说明你修改的方法,并对修改细节用红色框框定以及运行结果进行截图:
(2) 截图中要先使用3-2.exe lyw打印自己的学号,然后再使用cz或者不加cz运行结果。
提示:C语言初始化的全局
变量保存在统一保存数据段,局部变量保存在栈中,未初始化的全局变量保存在.bss段中。
参考做法(学号以我自己的为例):
(1) 先在用UltraEdit打开3-2.exe文件,查找2100130499的十六进制(7d2d72c3),由于数据是小端存储的,所以实际要查找的字符串为c3722d7d,然后将其替换为自己的学号2100130416(十六进制为7d2d7270),即字符串70722d7d。
(2) 修改第一处:直接修改数值
在源码文件中可以发现输出的是一个变量,而在main中发现就只有一个i变量,所以表示攻击值的变量应该是全局变量,用objdump -s .exe指令找到.data段,就可以发现很熟悉的变量值4了,这个就是攻击力了,然后就用UltraEdit修改这个值就好了。
修改第二处:修改判断语句
通过观察输出内容和源码文件,可以发现这个游戏先会通过x的值来判断VIP等级,那就可以把这个if的判断条件修改一下。最高等级是5级,判断条件是x>=648,大概可以猜到x的值应该是零,那就用UltraEdit将 648(十六进制为0x00000288,但判断语句是按大于来算的,所以应该是0x00000287)的字符串 87 02 00 00修改为 -1 (十六进制为 0xffffffff),如下图.
修改第一处运行截图:
修改第二处运行截图: