2021哈工大深入理解计算机系统Lab5(linklab)
2021哈工大计算机系统lab5:linklab
- 实验目的
- 实验环境与工具
- 硬件环境
- 软件环境
- 开发工具
- 实验内容
- LinkBomb程序框架
- phase1:全局变量 ⇔ 数据节
- phase2:指令 ⇔ 代码节
- phase3:符号解析
- phase4:switch语句与重定位
- 结语
实验目的
- 理解链接的作用与工作步骤。
- 掌握ELF结构与符号解析与重定位的工作过程。
- 熟练使用Linux工具完成ELF分析与修改。
实验环境与工具
硬件环境
X64 CPU; 2.40 GHz; 716G
软件环境
Windows10 专业版;Vmware; Ubuntu 20.04
开发工具
gdb; objdump; readelf; hexedit
实验内容
LinkBomb程序框架
//main
#include <stdio.h>
#include "config.h"void (*phase)(); /*初始化为0*/int main(int argc, const char* argv[])
{if(phase){(*phase)();}else{printf("To run lab, please link the relevant object module with the main module.\n");}return 0;
}
在各个阶段,运行main.o与修改后的phase[i].o链接生成的可执行程序,使之输出个人学号。
PS.以下各阶段中a0a1…a9表示学号,A0A1…A9表示学号各位数字对应的ASCII码(十六进制)
phase1:全局变量 ⇔ 数据节
输入
objdump -dx phase1.o
,得知输出字符串起始地址在.data节中偏移量为 0x1f字节的位置
用该命令同样也可以知道.data节再目标文件的偏移为0x60字节(File off)
使用hexedit打开phase1.o文件。找到偏移为(0x60 + 0x1f) 字节处。
将main.o与未修改的phase1.o链接,执行生成的可执行程序,输出字符串为
zqo3JlaZmWMP0uQQNyC3BL26RmpkbuRqnWZxH8FBJehIWz6Hl8uFa jtEVPTY nAapc W626N4xh9 Cav4y6RVljGNfDa0hhYlZ6Vo0tLqsES3 yGAajbwOMh3Rxd8Q4QouHqbZajkEhB6QB3wHt
与3中找出的字符串内容相同,确定此处为需要修改的字符串位置。
从此处开始修改内容为学号编码(后加0x00字节表示字符串结束)。
将main.o与修改后的phase1.o链接。执行生成的可执行程序,输出学号。
phase2:指令 ⇔ 代码节
使用objdump得出此处是传递的参数与MYID进行比较。根据比较结果分析下一步动作。
此处为调用puts函数,其参数与output函数参数相同。
因此在do_phase函数中,我们要先把一个参数值压入栈,然后再调用output函数。
调用output函数可以使用call+相对PC的偏移量。而参数的压栈需要查看调用do_phase函数时的寄存器状态与参数之间的关系。由下图只main函数中通过%eax调用phase函数(即phase2.o中的do_phase函数)。即%eax中存有do_phase函数的绝对地址。
而在do_phase函数中刚开始并没有改变%eax的值。
利用objdump查看lab2(main.o与未修改phase2.o链接生成)反汇编,得出do_phase函数与output函数之间的偏移为(0x1231 – 0x1265) = -0x34字节;同时也可以知道do_phase函数与.rodata节之间的偏移为(0x207c – 0x1265) = 0xe17字节.
在do_phase中先将.rodata地址压栈,然后再调用output函数。补全汇编代码应如下。
利用readelf找出phase2.o中do_phase函数的位置,偏移量为(0x34 + 0x34) = 0x68字节.
找到并修改phase2.o如下:
将main.o与修改后的phase.o链接,执行生成的可执行程序,输出学号。
phase3:符号解析
利用objdump,分析do_phase反汇编得出cookie字符串的组成内容:(地址由低到高)
0x69 0x6a 0x65 0x6d 0x79 0x7a 0x6f 0x70 0x78 0x6c 0x00(第十个没有用到)分析这段汇编代码可知,从地址为%ebp – 0x17的内存开始,取一个字节,然后把这个字节当作映射数组的索引,取出一个字符输出,下一次作为索引的字节的地址为上次作为索引的地址加一,与phase3.c的程序框架相照应。在此图中同样可以得知该数组索引的符号名为yuYibdBlfT
此处为计数功能,当累计输出10个字符后输出回车,输出程序的关键部分结束。
编写一个映射数组c文件,只需将cookie字符串的前十个字节作为索引,依次把自己的序号字符填入即可(其他位置任意)。如图(可以适当布局设计无关位置方便索引):
编译汇编phase3_patch.c得到phase3_patch.o,与main.o和phase3.o一起链接生成可执行程序。执行该程序,输出学号。
phase4:switch语句与重定位
第一步与阶段3的第一步相同,找到COOKIE字符串的组成内容:(地址由低到高):
0x44 0x58 0x4a 0x42 0x59 0x47 0x4e 0x52 0x48 0x5a 0x00利用objdump生成反汇编文件phase4dx.txt,可以分析出来此处和阶段3相同,也是一个一个字符取出来进行操做。
从这几句可以判断出%eax先减去了0x41后与0x19比较,根据比较结果以及减去0x41后的结果进行跳转。
在这个文件中也可以查出.rodata节的偏移为0x184字节,大小为0x68字节。
使用hexedit打开phase4.o,找到.rodata节的部分。将.rodata节中的数据(跳转表)存入新建的.rodata文档中。
根据我们的cookie值,以及刚刚的跳转表,可以得出跳转地址。
我们只要将跳转表修改,使程序按照我们cookie的值选择地址跳转后,正好按顺序输出学号中的字符即可。
由下图可知每次根据跳转表跳转到某个地址后,会固定输出某个特定的字符。
我们根据学号中的字符查询到跳转表中应该存储的地址(到时候重定位会把更改.rodata的值,故写此时的“绝对”地址即可),将需要更改的地方先存入rodata.txt文件中,下图以查询使程序输出1的地址示例:
PS.修改之后的跳转表中0~5是为了方便索引无实际意义。空白位
置包括索引位置表示原跳转表不必要更改。
按照rodata.txt中的内容修改phase4.o如下。
将修改后的phase4.o与main.o链接生成可执行程序。执行该可执行程序,输出学号。
结语
由于时间比较紧,就没有看phase5。之后如果有时间的话再把第五阶段发出来(并且如果会做的话
2021哈工大深入理解计算机系统Lab5(linklab)相关推荐
- 2021春深入理解计算机系统大作业---hello的一生
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算学部 学 号 120L021725 班 级 2003006 学 生 杨楠 指 导 ...
- 2021春深入理解计算机系统大作业——程序人生
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算学部 学 号 1190200608 班 级 1903004 学 生 琚晓龙 指 导 ...
- 2021哈工大计算机系统大作业——程序人生-Hello’s P2P
计算机系统 大作业 题 目 程序人生-Hello's P2P 计算机科学与技术学院 2021年6月 摘 要 本文介绍了hello的整个生命过程.利用gcc,gdb,edb,readelf,H ...
- HIT深入理解计算机系统大作业
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算机 学 号 120L021909 班 级 2003006 学 生 邢俊文 指 导 ...
- 深入理解计算机系统(CSAPP)含lab详解 完结
文章目录 深入理解计算机操作系统-第一章 1.1 信息就是位 + 上下文 1.2 程序被其他程序翻译成不同的格式 1.3 了解编译系统如何工作是大有益处的 1.4 处理器读并解释储存在内存中的指令 1 ...
- 【《深入理解计算机系统》读书笔记(3)】 第3章 程序的机器级表示
[时间]2021.11.19 [题目]<深入理解计算机系统>读书笔记(3) 第3章 程序的机器级表示 目录 一.简介 二.一些重点图 1.常见数据类型格式 2.16个整数寄存器 3.寄存 ...
- 哈工大2022春计算机系统大作业
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算机类 学 号 班 级 学 生 指 导 教 师 计算机科学与技术学院 2021年5月 摘 ...
- 深入理解计算机系统思维导图
<深入理解计算机系统>思维导图 文章目录 <深入理解计算机系统>思维导图 前言 一.第1章 计算机系统漫游 二.第2章 信息的表示和处理 三.第5章 优化程序性能 四.第7章 ...
- 《深入理解计算机系统》读书随笔-位操作
最近开始读<深入理解计算机系统>这本书.对于书中提到的从程序员的角度解读计算机系统这一说法非常感兴趣,所以决定好好读一读.从开始接触计算机编程就是站在一个高级语言的层次,虽然对编译原理,操 ...
最新文章
- PMVS:多视图匹配经典算法
- PCB设计必知:布局及设计规范
- 干货|且看Pyecharts如何制作多个子图
- 立镖机器人浙江_立镖在美国获2020 NextGen供应链解决方案奖
- redhat系统双网卡绑定
- 信息学奥赛一本通 1193:吃糖果 | OpenJudge NOI 2.6 1944:吃糖果
- Theano3.7-练习之堆叠消噪自动编码器
- 不藏了,这些Java反射用法总结都告诉你们
- data structure最短路径问题
- 在FL Studio中编辑视频中的音频
- 如何解决ADB server didn't ACK
- 帧率常量15可以随便改,问为什么是15,是想暴露自己不懂编程?
- 测试用例设计——软件测试基础
- Linux期末考试模拟试题
- 2020MathorCup数学建模比赛A题D题思路
- 数学建模-二胎政策对中国人口的影响
- Matlab基于主分量的人脸重建显示
- 2022年贵州省职业院校技能大赛中职组网络安全赛项规程
- WIN11 TortoiseSVN 无论什么操作,都报同一个错误:请求的操作需要提升
- 从大厂离职后,AI 大神们选择加入 AI 初创公司
热门文章
- 2022年河南省高职单招(综合素质)考试冲刺试题及答案
- python用什么软件编程?
- 学python可以从事什么工作,python是做什么的软件
- Excel MATCH函数判断两列包含关系
- IT职场人生:学外语
- js array 添加对象_不可不知的 Vue.js 列表渲染
- 《沟通的技术——让交流、会议与演讲更有效》一1.1 一切尽在计划之中
- LT8911EXB 产品功能概述 MIPIDSI/CSI转EDP
- P4417 [COCI2006-2007#2] STOL
- 关于硬盘不可不知的基础知识-硬盘开盘修复