哈工大 csapp lab5

实验报告

实 验(五)

题 目 LinkLab
链接  
专 业 计算机科学与技术
学   号 190110812
班   级 7
学 生 刘新晨    
指 导 教 师 吴锐   
实 验 地 点 G707    
实 验 日 期 2021/5/16

计算机科学与技术学院

目 录

第1章 实验基本信息 - 3 -
1.1 实验目的 - 3 -
1.2 实验环境与工具 - 3 -
1.2.1 硬件环境 - 3 -
1.2.2 软件环境 - 3 -
1.2.3 开发工具 - 3 -
1.3 实验预习 - 3 -
第2章 实验预习 - 4 -
2.1 ELF文件格式解读 - 4 -
2.2程序的内存映像结构 - 4 -
2.3程序中符号的位置分析 - 4 -
2.4程序运行过程分析 - 4 -
第3章 各阶段的原理与方法 - 5 -
3.1 阶段1的分析 - 5 -
3.2 阶段2的分析 - 5 -
3.3 阶段3的分析 - 5 -
3.4 阶段4的分析 - 5 -
3.5 阶段5的分析 - 5 -
第4章 总结 - 6 -
4.1 请总结本次实验的收获 - 6 -
4.2 请给出对本次实验内容的建议 - 6 -
参考文献 - 7 -

第1章 实验基本信息

1.1 实验目的
理解链接的作用与工作步骤
掌握ELF结构与符号解析与重定位的工作过程
熟练使用Linux工具完成ELF分析与修改
1.2 实验环境与工具
1.2.1 硬件环境
X64 CPU;8G RAM;2.60GHz;
1.2.2 软件环境
Win10 64位以上;VMware 15.5.7; Ubuntu 64位
1.2.3 开发工具
Visual Studio 2019 64位以上;CodeBlocks 64位;vi; vim; gcc

第2章 实验预习
2.1 ELF文件格式解读
请按顺序写出ELF格式的可执行目标文件的各类信息(5分)

段头部表:将连续的文件映射到运行时的内存段
. init : 定义了_init函数,程序初始化代码会调用它
. text : 已编译程序的机器代码
. rodata : 只读数据,比如printf语句中的格式串和开关语句的跳转表
. data : 已初始化的全局和静态C变量
. bss : 未初始化的全局和静态C变量
. symtab :一个符号表,它存放在程序中定义和引用的函数和全局变量的信息
. debug : 一个调试符号表,其条目时程序中定义的全局变量和类型定义,程序中定义和引用的全局变量,以及原始的C源文件。
. line : 原始C源程序的行号和.text节中机器指令之间的映射
. strtab : 一个字符串表,其内容包括 .symtab 和 .debug节中的符号表,以及节头部中的节名字。
节头部表:描述目标文件的节。
2.2程序的内存映像结构
请按照内存地址从低到高的顺序,写出Linux下X64内存映像(5分)
内核内存
用户栈
共享库的内存映射区域
运行堆
读写段
只读代码段

2.3程序中符号的位置分析
请运行“LinkAddress -u 学号 姓名” 按地址顺序写出各符号的地址、空间。并按照Linux下X64内存映像标出其所属各区(5分)

2.4程序运行过程分析
请按顺序写出LinkAddress从开始执行到main前/后执行的子程序的名字(使用gcc与objdump/GDB/EDB)(5分)
main执行前:
Breakpoint 1 at 0x400598
_init;
Breakpoint 2 at 0x4005d0
free@plt;
Breakpoint 3 at 0x4005e0
puts@plt;
Breakpoint 4 at 0x4005f0
__stack_chk_fail@plt;
Breakpoint 5 at 0x400600
printf@plt;
Breakpoint 6 at 0x400610
__libc_start_main@plt;
Breakpoint 7 at 0x400620
malloc@plt;
Breakpoint 8 at 0x400630
exit@plt;
Breakpoint 9 at 0x400650
_start;
Breakpoint 10 at 0x400680
deregister_tm_clones;
Breakpoint 11 at 0x4006c0
register_tm_clones;
Breakpoint 12 at 0x400700
__do_global_dtors_aux;
Breakpoint 13 at 0x400720
frame_dummy;
Breakpoint 14 at 0x40074a
show_pointer;
Breakpoint 15 at 0x40077b
useless;

main执行后:
Breakpoint 16 at 0x400786
main;
Breakpoint 17 at 0x400b10
__libc_csu_init;
Breakpoint 18 at 0x400b80
__libc_csu_fini;
Breakpoint 19 at 0x400b84
_fini;

第3章 各阶段的原理与方法
每阶段40分,phasex.o 20分,分析20分,总分不超过80分
3.1 阶段1的分析
程序运行结果截图:

分析与设计的过程:

直接将main.o进行编译,得到linkbomb,运行之后显示如下截图

可以看到这是一串没有什么特殊意义字符串。我们的目标就是将该字符串的前部替换为我们的学号,最终使屏幕输出我们的学号。
用hexedit打开phase1.o后如下

学号190110812对应的ascii码为:31 39 30 31 31 30 38 31 32
将其替换即可
3.2 阶段2的分析
程序运行结果截图:
分析与设计的过程:
3.3 阶段3的分析
程序运行结果截图:

分析与设计的过程:
使用readelf工具分析phase3.o,得到如下截图

可见最终输出的字符存储在InWlvNHiCR数组中,所以我们的工作是:得到cookie数组,根据cookie数组构造InWlvNhiCR数组,要求按照cookie的索引顺序在InWlvNhiCR中依次填入自己的学号。
用edb打开linkbomb3如下图所示

得到我的cookie数组是zwelvksjr,122,119,101,108,118,107, 115, 106, 114

然后将三个文件链接在一起即可
3.4 阶段4的分析
程序运行结果截图:
分析与设计的过程:
3.5 阶段5的分析
程序运行结果截图:
分析与设计的过程:

第4章 总结
4.1 请总结本次实验的收获
对链接的作用和工作步骤有了更深的理解;
学会使用readelf工具查看elf可重定位目标文件;
学会使用hexedit对 .o文件进行修改
掌握了链接过程中的符号解析和重定位的过程
4.2 请给出对本次实验内容的建议

建议老师讲的详细一点

注:本章为酌情加分项。

参考文献

为完成本次实验你翻阅的书籍与网站等
[1] 林来兴. 空间控制技术[M]. 北京:中国宇航出版社,1992:25-42.
[2] 辛希孟. 信息技术与信息服务国际研讨会论文集:A集[C]. 北京:中国科学出版社,1999.
[3] 赵耀东. 新时代的工业工程师[M/OL]. 台北:天下文化出版社,1998 [1998-09-26]. http://www.ie.nthu.edu.tw/info/ie.newie.htm(Big5).
[4] 谌颖. 空间交会控制理论与方法研究[D]. 哈尔滨:哈尔滨工业大学,1992:8-13.
[5] KANAMORI H. Shaking Without Quaking[J]. Science,1998,279(5359):2063-2064.
[6] CHRISTINE M. Plant Physiology: Plant Biology in the Genome Era[J/OL]. Science,1998,281:331-332[1998-09-23]. http://www.sciencemag.org/cgi/ collection/anatmorp.

你可能感兴趣的:(哈工大 csapp lab5)