目录
1. 任务描述
2. 实验阶段
2.1 反汇编+获取重定位记录
2.2 构建文本
2.3 验证是否完成实验目标
1. 任务描述
针对给定的可重定位目标文件“phase1.o”(不允许修改),编写完成给定C源程序“phase1_patch.c”的内容(初始为空),进一步对其如下进行编译、生成名为“phase1_patch.o”的二进制可重定位目标文件:
gcc -fno-pie -c phase1_patch.c
进一步,如下将phase1_patch.o模块与main.o、phase1.o模块进行链接,要求生成的可执行程序在运行时输出目标字符串“123456789”。
gcc -no-pie -o linkbomb main.o phase1.o phase1_patch.o
./linkbomb
目标字符串
注意:实验目录中的phase1-backup.o文件与未修改的phase1.o相同,供可用于重置/覆盖实验中被错误修改的phase1.o目标文件。
2. 实验阶段
① 使用objdump工具获得目标文件的汇编代码,使用readelf工具获得其重定位记录;
② 使用实验平台中的objdump工具获得可重定位目标模块phase1.o的反汇编代码,使用readelf工具获得目标文件中的重定位记录和符号表;
③ 分析汇编代码,理解程序输出目标字符串的过程;结合重定位信息、符号表获知与输出字符映射相关的符号引用情况;
④ 结合上述信息并依照本实验关卡的目标要求,相应在C程序模块phase1_patch.c中编写合适的数据结构(可使用vim等编辑器)
2.1 反汇编+获取重定位记录
1. 先切换当前工作目录到目标关卡
cd /data/workspace/myshixun/step1
2. 使用实验平台中的objdump工具获得可重定位目标模块phase1.o的反汇编代码,使用readelf工具获得目标文件中的重定位记录和符号表;
objdump -d -r phase1.o
3. 获取符号表
readelf -s phase1.o
可以看到这个函数里存放着256个可查询的字符
2.2 构建文本
vim phase1_ans.c
编写代码如下:(按“I”进入编辑模式)
编辑完成后按“ESC”退出编辑模式,键入“:wq”保存
gcc phase1_ans.c -std=gnu99&& ./a.out
输入上面的命令查看(-std=gnu99->C99标准)
输入指令:
gcc -c phase1_patch.c -m32
gcc main.o phase1.o phase1_patch.o -m32
./a.out
这里我们需要将“C”改为“1”,“D”改为“2” ,“Q”改为“3” ,“Z”改为“4” ,“H”改为“5” ,“T”改为“6” ,“S”改为“7” ,“U”改为“8” ,“R”改为“9” (可以复制到VSCode里面,通过Ctrl + F快速查找替换)
char HEnztieJvE[256] = {
'A',
'B','1','2','E','F','G','5','I','J','K','L','M','N','O','P','3',
'9','7','6','8','V','W','X','Y','4','A','B','1','2','E','F','G',
'5','I','J','K','L','M','N','O','P','3','9','7','6','8','V','W',
'X','Y','4','A','B','1','2','E','F','G','5','I','J','K','L','M',
'N','O','P','3','9','7','6','8','V','W','X','Y','4','A','B','1',
'2','E','F','G','5','I','J','K','L','M','N','O','P','3','9','7',
'6','8','V','W','X','Y','4','A','B','1','2','E','F','G','5','I',
'J','K','L','M','N','O','P','3','9','7','6','8','V','W','X','Y',
'4','A','B','1','2','E','F','G','5','I','J','K','L','M','N','O',
'P','3','9','7','6','8','V','W','X','Y','4','A','B','1','2','E',
'F','G','5','I','J','K','L','M','N','O','P','3','9','7','6','8',
'V','W','X','Y','4','A','B','1','2','E','F','G','5','I','J','K',
'L','M','N','O','P','3','9','7','6','8','V','W','X','Y','4','A',
'B','1','2','E','F','G','5','I','J','K','L','M','N','O','P','3',
'9','7','6','8','V','W','X','Y','4','A','B','1','2','E','F','G',
'5','I','J','K','L','M','N','O','P','3','9','7','6','8','V',};
将修改好的字符数组通过vim编辑器放到phase1_patch.c文件中
vim phase1_patch.c
编辑完成后按“ESC”退出编辑模式,键入“:wq”保存
重新输入指令:
gcc -c phase1_patch.c -m32
gcc main.o phase1.o phase1_patch.o -m32
./a.out
可以看到字符已经成功被修改为“123456789”
2.3 验证是否完成实验目标
gcc -no-pie -o linkbomb main.o phase1.o
./linkbomb
可以看到程序的输出就是我们所期望的“123456789”,至此,实验圆满结束。