计算机组成原理实验三-修改二进制文件的程序改变最终运行结果

实验资料:
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

  1. 通过编写下面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 了,该文件便是所需要的反汇编文件了

截图参考:全局变量地址
局部变量地址
反汇编

扫描二维码关注公众号,回复: 15273921 查看本文章
  1. 下载附件中的“2100130499VIP.exe”。安装并使用ultraEdit软件,强制将修改文件中的if…else分支语句,将”2100130499普通会员”修改成“你自己的学号VIP”,并截图在ultraEdit软件修改的部分(用红色框框定),以及在DOS中修改前1次及修改后2次的运行截图。
    附件: 2100130499VIP.exe
    截图要求
    要求:尽量多的说明你修改的方法,并对修改细节进行截图:

答:先在用UltraEdit打开2100130499VIP.exe文件,由于字符串的存储方式是ASCⅡ,直接搜索(快捷键 Ctrl + F)2100130499,然后修改为 “自己的学号”。

搜索

再搜索字符串2100130499common,将其修改为 “自己的学号 + VIP” 后面的三个字符修改为0,然后就修改完成了。

搜索
注意

  1. 下载附件中的“3-2.exe”(可参考objdump -S的部分反汇编出源代码文件 3-2-g-part.txt)。安装并使用ultraEdit软件,强制将修改文件中的某些数值或者分支语句。
    附件:3-2.exe3-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),如下图.
源码
修改示例

修改第一处运行截图:
运行截图

修改第二处运行截图:
运行截图

猜你喜欢

转载自blog.csdn.net/qq_46373141/article/details/130782172