计算机系统基础实验-LinkLab实验

article/2025/8/28 23:29:36

这是大三时的实验课,很久以前的东西,应要求放出来,做的不是很好。linux永远都是很重要的,希望我和大家都记得这个。实际上做到第五阶段我就不会了。

实验课程名称:计算机系统基础

实验项目名称:LinkLab实验


实验目的与要求

在实验中的每一阶段n(n=1,2,3,4,5…),按照阶段的目标要求修改相应可重定位二进制目标模块phase[n].o后,使用如下命令生成可执行程序linkbomb:

$ gcc -o linkbomb main.o phase[n].o [其他附加模块——见具体阶段说明]

正确性验证:如下运行可执行程序linkbomb,应输出符合各阶段期望的字符串: 

$ ./linkbomb

$ 123456789          [仅供示例,具体目标字符串见每阶段说明]

实验结果:将修改后正确完成相应功能的各阶段模块(phase1.o, phase2.o, …)提交供评分。 

实验原理与内容

实验内容

每个实验阶段(共6个)考察ELF文件组成与程序链接过程的不同方面知识

阶段1:全局变量ó数据节

阶段2:指令ó代码节

阶段3:符号解析

阶段4:switch语句与重定位 

阶段5:重定位 

   阶段6:重定位( PIC)

 

实验步骤

1. 实验数据

学生实验数据包: linklab-学号.tar

数据包中包含下面文件:

main.o:主程序的二进制可重定位目标模块(实验中无需修改)

phase1.o, phase2.o, phase3.o, phase4.o, phase5.o, phase6.o:各阶段实验所针对的二进制可重定位目标模块,需在相应实验阶段中予以修改。

解压命令:tar xvf linklab-学号.tar

2. 实验工具

readelf:读取ELF格式的各.o二进制模块文件中的各类信息,如节(节名、偏移量及其中数据等)、符号表、字符串表、重定位记录等 

objdump:反汇编代码节中指令并提供上述部分类似功能 

(可选)hexedit:编辑二进制文件内容 

 

实验阶段1

要求:修改二进制可重定位目标文件“phase1.o”的数据节内容(不允许修改其它节的内容),使其与main.o链接后能够运行输出(且仅输出)自己的学号: 

 

       

 

 

 

实验提示: 

检查反汇编代码,获得printf输出函数的调用参数的(数据节中)地址 

使用hexedit工具(或自己编写实现二进制ELF文件编辑程序),对phase1.o数据节中相应字节进行修改 

 

实验阶段2

要求:修改二进制可重定位目标文件“phase2.o”的代码节内容(不允许修改其它节的内容),使其与main.o链接后能够运行输出(且仅输出)自己的学号:

 

       

 

实验提示: 

检查反汇编代码,定位模块中的各组成函数并推断其功能作用 

修改入口函数do_phase()中的机器指令(用自己指令替换函数体中的nop指令)以实现期望的输出 

 

实验阶段3

要求:创建生成一个名为“phase3_patch.o”的二进制可重定位目标文件(不允许修改其它.o模块),使其与main.o、phase3.o链接后能够运行和输出(且仅输出)自己的学号: 

 

 

实验提示: 

phase3.o模块入口函数do_phase()依次遍历一个COOKIE字符串(由一组互不相同的英文字母组成,且总长度与学号字符串相同)中的每一字符,并将其不同可能ASCII编码取值映射为特定输出字符 

了解并利用符号解析规则 

 

实验阶段4

要求:修改二进制可重定位目标文件“phase4.o”中相应节中的数据内容(不允许修改.text节的内容),使其与main.o链接后能够运行输出(且仅输出)自己的学号: 

 

实验提示: 

模块入口函数do_phase()依次遍历一个COOKIE字符串(由一组互不相同的大写英文字母组成,且总长度与学号字符串相同)中的每一字符,并将其不同可能ASCII编码取值映射为特定输出字符 

了解掌握switch语句的机器表示的各组成部分及其重定位信息

实验阶段5

要求:修改二进制可重定位目标文件“phase5.o”的相关重定位节中的数据内容(不允许修改其它节的内容),补充完成其中被清零的一些重定位记录(分别对应于本模块中需要重定位的符号引用),使其与main.o链接后能够正确输出(且仅输出)自己学号的编码结果:

 

 

 

   

实验提示:如果实验中对缺失重定位信息的恢复不完整或不正确的话,链接生成linkbomb程序时可能不报错,但运行程序可能得到以下结果之一: 

出现“Segmentation fault”出错信息——原因?“如果未对相关引用进行必要的重定位会发生什么?”

输出“Welcome to this small lab of linking. To begin lab, please link the relevant object module(s) with the main module. ”——提示模块未链接。可能原因:虽然按上述步骤在生成linkbomb程序时实际已链接进phase4.o模块,但某个重要的重定位记录未正确设置。

输出不正确的编码结果 

实验第六阶段不做强制性要求

 

 

 

实验阶段6

要求:修改二进制可重定位目标文件“phase6.o”的相关重定位节中的数据内容(不允许修改其它节的内容),补充完成其中被清零的一些重定位记录(分别对应于本模块中需要重定位的符号引用),使其与main.o链接后能够正确输出(且仅输出)自己学号的编码结果: 

 

 

 

实验提示: 

本阶段的程序框架与阶段5相同,唯一区别是phase6.o采用了Position Independent Code (PIC)的编译方式(即编译生成可重定位目标模块时使用了GCC的“-fPIC”选项),因此模块中对数据和函数的引用方式及其重定位信息发生变化 

了解、熟悉PIC的基本实现技术 

可编写样例程序并分别加上或省略“-fPIC”选项进行编译,再通过比较各自反汇编的结果,了解相同C源代码的PIC与Non-PIC机器级实现之间的差异。

 

学生实验结果提交

将修改完成的各阶段模块(phase1.o, phase2.o, phase3_patch.o, phase4.o, phase5.o, phase6.o)和未改动的main.o、phase3.o模块一起用tar工具打包并命名为“学号.tar”: 

linux> tar cvf 学号尾数(与拿到的tar包相同).tar main.o phase1.o phase2.o phase3.o phase3_patch.o phase4.o phase5.o phase6.o

实验设备与软件环境

Linux 32-bit,C/汇编语言

 

 

实验过程与结果(可贴图)

实验阶段1

要求:修改二进制可重定位目标文件“phase1.o”的数据节内容(不允许修改其它节的内容),使其与main.o链接后能够运行输出(且仅输出)自己的学号: 

 

 

实验提示: 

检查反汇编代码,获得printf输出函数的调用参数的(数据节中)地址 

使用hexedit工具(或自己编写实现二进制ELF文件编辑程序),对phase1.o数据节中相应字节进行修改 

输入mydebian@Mydebian:~/23$ readelf -a phase1.o 查看elf文件内容

找到输出的.data 节中偏移量为32的位置。

如下图:

 

 

 

 

然后输入

mydebian@Mydebian:~/23$ gcc -m32 -o linkbomb1 main.o phase1.o

mydebian@Mydebian:~/23$ ./linkbomb1

Y                 On5TXwyRqWFIARrElCC3uFZ1XpL8WYFNgr2hRgaTvpwppI6UmbGZEizWx6JSTu5jfamz0LqFXDoHti9J9T1 Sn1FXeRxBm143PaIosUOhgNDjjClFjbQwoIUGG1BsTVVlFINsjooMWwgkHu7

青色的字体为输处的文字,然后输入hexedit phase1.o

再运行linkbomb程序,得到如下图所示:

 

找到了刚刚青色背景标记的字符串。

从y开始哪个字符串开始修改,对比ASCII码,我的学号为是多少,就对应的ASCII码。

 

直接修改对应的字符串:

 

删除前一个linkbomb,生成新的linkbomb,最后重新输出得到我们要的结果:

阶段一完成

 

 

 

实验阶段2

要求:修改二进制可重定位目标文件“phase2.o”的代码节内容(不允许修改其它节的内容),使其与main.o链接后能够运行输出(且仅输出)自己的学号:

 

实验提示: 

检查反汇编代码,定位模块中的各组成函数并推断其功能作用 

修改入口函数do_phase()中的机器指令(用自己指令替换函数体中的nop指令)以实现期望的输出 

创建文件phase2_linkbomb2.s

输入如下文本:

movl %eax,%ebx

subl $0x8,%ebx

movl -0xc(%eax),%eax

addl %ebx, %eax

pushl $0x00003332   //我的学号为23号,ASCII码为32 33小端存放

pushl %esp

call *%eax

addl $0x8,%esp

输入gcc -m32 -c phase2_linkbomb2.s生成phase2_linkbomb2.o文件

再输入objdump -d phase2_linkbomb2.o读取文件

mydebian@Mydebian:~/23$ objdump -d phase2_linkbomb2.o

phase2_linkbomb2.o:     file format elf32-i386

Disassembly of section .text:

00000000 <.text>:

   0:   89 c3                   mov    %eax,%ebx

   2:   83 eb 08                sub    $0x8,%ebx

   5:   8b 40 f4                mov    -0xc(%eax),%eax

   8:   01 d8                   add    %ebx,%eax

   a:   68 32 33 00 00          push   $0x3332

   f:   54                      push   %esp

  10:   ff d0                   call   *%eax

  12:   83 c4 08                add    $0x8,%esp

输入hexedit phase2.o将上面的内容填补进nop中。

 

相当于修改上面的反汇编代码。

 

 

CTRL+W保存

再输入:

mydebian@Mydebian:~/23$ gcc -m32 -c phase2_linkbomb2.s

./linkbomb2

可以得到需要的结果。

阶段二完成。

 

 

实验阶段3

要求:创建生成一个名为“phase3_patch.o”的二进制可重定位目标文件(不允许修改其它.o模块),使其与main.o、phase3.o链接后能够运行和输出(且仅输出)自己的学号: 

 

实验提示: 

phase3.o模块入口函数do_phase()依次遍历一个COOKIE字符串(由一组互不相同的英文字母组成,且总长度与学号字符串相同)中的每一字符,并将其不同可能ASCII编码取值映射为特定输出字符 

了解并利用符号解

 

首先输入命令objdump -d -r phase3.o查询:

 

然后用命令readelf -s phase3.o读取字符串长度:

 

创建文本phase03_take.c

可以知道这个函数中存放着256个可查询的字符,编写代码如下:

#include<stdio.h>

int main(){

    for(int i=0, p=0; i<=256; ++i ){

        char ch='A'+p;

        printf("'%c',", ch);

        if(!(i%16)) printf("\n");

        if('A'+(++p)>'Z') p=0;//注意带小写

    }

    return 0;

}

输入 gcc phase03_take.c -std=gnu99&& ./a.out查看。

(-std=gnu99->C99标准)

 

 

 

这些字符用于填充zcbGMMwCmU()函数中可存放的区域。

复制建立新文本phase03_patch.c,将截图中的字符放入文本中

 

连续输入指令

mydebian@Mydebian:~/23$ gcc -c phase03_patch.c -m32

mydebian@Mydebian:~/23$  gcc main.o phase3.o phase03_patch.o -m32

mydebian@Mydebian:~/23$ ./a.out

IU//这个字符为phase03输出的字符,

也就是说将I,U字符改为2,3(这里的I,U不是说所有的字符,而是所有字符中被输出的某个字符’I’和字符’U’,为了不需要逐个寻找被输出的那两位字符)即可,如下图(可以改用其他字符,例如数字字符由’1’-’9’,但这样需要修改的位置更多)。

 

 

修改后重新输出:

mydebian@Mydebian:~/23$ gcc -c phase03_patch.c -m32

mydebian@Mydebian:~/23$ gcc main.o phase3.o phase03_patch.o -m32

mydebian@Mydebian:~/23$  ./a.out

23

阶段3完成。

 

 

实验阶段4

要求:修改二进制可重定位目标文件“phase4.o”中相应节中的数据内容(不允许修改.text节的内容),使其与main.o链接后能够运行输出(且仅输出)自己的学号: 

 

实验提示: 

模块入口函数do_phase()依次遍历一个COOKIE字符串(由一组互不相同的大写英文字母组成,且总长度与学号字符串相同)中的每一字符,并将其不同可能ASCII编码取值映射为特定输出字符 

了解掌握switch语句的机器表示的各组成部分及其重定位信息

连续输入指令

 

查看可得输出放入字符为这两个。那么直接用阶段一的方法,

输入hexedit phase4.o进入程序内查看

S|对应ASCII码分别为53 7C,修改为学号23对应ASCII码为32,33

 

输入命令查看结果正确:

 

 

实验阶段5

要求:修改二进制可重定位目标文件“phase5.o”的相关重定位节中的数据内容(不允许修改其它节的内容),补充完成其中被清零的一些重定位记录(分别对应于本模块中需要重定位的符号引用),使其与main.o链接后能够正确输出(且仅输出)自己学号的编码结果:

实验提示:如果实验中对缺失重定位信息的恢复不完整或不正确的话,链接生成linkbomb程序时可能不报错,但运行程序可能得到以下结果之一: 

出现“Segmentation fault”出错信息——原因?“如果未对相关引用进行必要的重定位会发生什么?”

输出“Welcome to this small lab of linking. To begin lab, please link the relevant object module(s) with the main module. ”——提示模块未链接。可能原因:虽然按上述步骤在生成linkbomb程序时实际已链接进phase4.o模块,但某个重要的重定位记录未正确设置。

输出不正确的编码结果 

首先输入命令objdump phase5.o -d >phase5.txt转化成文本:

打开文本phase5.txt寻找偏移量:       

 

 

 

 

 

 

 


http://chatgpt.dhexx.cn/article/Kji5pQWm.shtml

相关文章

Lab5实验分享

文章目录 一.全局变量名词解释二.实验难点图示1.文件系统层次关系梳理2.多级目录与多级索引 三.代码梳理1.磁盘管理2.文件系统3.用户接口4.文件服务 一.全局变量名词解释 #define NBLOCK 1024 //一块磁盘里面的block数目 uint32_t nbitblock; // 用于存储bitmap的block数目 ui…

实验.......

第一步配置ip与环回地址 做hub&spoken的fullmesh结构以r2为例 其他路由同样操作 要求使用rip协议&#xff0c;以r2为例

实验吧——WEB-认真一点!

认真一点&#xff01; 打开链接&#xff0c;看到这个页面&#xff0c;第一反应又是sql注入 翻翻源码没有任何提示 打开burp开始抓包&#xff0c;包头与返回头又没有任何提示&#xff0c;试着开始修改ID 的值&#xff0c;观察页面变化。 提交1或用语句让框内为真&#xff0c;显…

实验....

实验要求 r1代表运营商 r1远程登录r2实际登陆r9 r3访问r7的换回地址走r5 全网可达 1.全网可达 配置ip 2配置rip协议&#xff0c;r8r9用v1其余用v2 3让r8r9接入内网&#xff0c;在r8对端接口写入v2 r3访问r7的换回地址走r5 r1代表运营商 r1远程登录r2实际登陆r9 先打开r…

实验吧 认真一点!

真的很久很久没碰过这个玩意了&#xff0c;真是不会了&#xff0c;而且这个题目本身就不是很容易&#xff0c;搞得我也是满肚子邪火&#xff0c;很气。这个题目主要难在它吧过滤和ban结合到了一起了。我们还是先看题目,首先拿到题目看到输入id0和输入id1结果不一样&#xff0c;…

让我进去-实验吧

这题做的真的是久&#xff0c;莓办法&#xff0c;太菜了 进去看见cookie有个source值很奇怪&#xff0c;把他改成1试一下就收到这段代码 $flag "XXXXXXXXXXXXXXXXXXXXXXX"; $secret "XXXXXXXXXXXXXXX"; // This secret is 15 characters long for secu…

实验吧

1.变异凯撒 把flag转化为ascii码&#xff0c;加密密文转化为ascii码&#xff0c; 因为是凯撒加密&#xff0c;所以思考移动的位数&#xff0c;分别是加了5&#xff0c;6&#xff0c;7&#xff0c;8.。。。 所以移动的位次是从5递加 得到结果 ascii码值转化&#xff0c;得到flag…

[大学物理实验-5]波尔共振实验

[大学物理实验-5]波尔共振实验 前言实验预习&#xff08;Preview&#xff09;实验报告&#xff08;Report&#xff09;实验报告&#xff08;Report&#xff09;总结&#xff08;Sum up&#xff09; 前言 最近在整理一些学过的课程的资料&#xff0c;有一些课虽然和我的专业毫无…

实验一-Bomblab(炸弹实验)

实验概述&#xff1a;该实验就是通过分析汇编代码&#xff0c;并使用GDB调试&#xff0c;找到每一题的通关钥匙 第一关&#xff1a;&#xff08;key“He is evil and fits easily into most overhead storage bins.”&#xff09; 简单解析&#xff1a;比…

实验.........

首先配置ip地址和环回地址 以r1为例 先用ospf联通r2r3r4r5r6r7 以r2为例 r1启bgp与r2建邻 r2r3r4r5r6r7同理建邻居 这里以r2为例 r7r8建邻方法同r1r2 优化在r2上

实验........

实验....... 先配置ip地址以r2为例 然后配置rip同样以r2为例 启用bgp建立对等体&#xff0c;需要书写as号 以r1与r3为例 建立ebgp 以r3r4为例 r3 r4 建立换回&#xff0c;以环回为对等提

shlab实验

计算机系统原理实验报告 一、实验目的及内容 1. 实验目的&#xff1a;通过编写完善一个支持作业控制的简单 Unix 外壳 Shell 程序&#xff08;tsh&#xff09;, 掌握 shell 的基本功能原理和实现方法;掌握 Unix 进程控制、特别是信号的应用&#xff0c; 包括信号产生和信号…

Lab2实验分享

文章目录 一.TLB访存机制二.二级页表三.Page存储结构四.自映射机制图示五.页面与地址的转化六.部分实验代码详解 一.TLB访存机制 当一个虚拟地址被送到MMU中进行翻译的时候&#xff0c;硬件首先在TLB中寻找包含这个地址的页面&#xff0c;如果它的虚页号在TLB中&#xff0c;并…

实验吧(1)

实验吧真是一个神奇的地方&#xff0c;里面的东西表示全部都看不懂&#xff0c;emmmmm &#xff0c;加油&#xff01;好好学习&#xff01; 案例&#xff1a;忘记密码了&#xff01; 在实验吧里面打开解题链接&#xff0c;然后就会跳转到一个输入密码的页面&#xff0c;当然你…

实验吧 认真一点

本实验是输入id获取结果&#xff0c;查看页面源码&#xff0c;没有什么注释信息。随便输入个1&#xff0c;结果为You are in ...............&#xff0c;其他的id显示为You are not in ............... 使用Burp suite进行模糊测试&#xff0c;结果为or部分sql命令都可以使用。…

实验吧_网站综合渗透_Discuz!

前言 这个一个实验吧中的环境&#xff0c;分值为50分&#xff0c;下面是题目说明。诶&#xff0c;发现自己很菜。 实验吧_网站综合渗透_dedecms解析地址 需要的学会或者已经掌握的知识 已知cms版本在线搜索通用漏洞掌握菜刀或者类似的工具的使用其他 题目说明 你是国内一流安…

实验吧-简单的登录题——WriteUp再研究

前言 这个题目的难点就是在于对于CBC加密方式尤其是解密这部分要琢磨一番&#xff0c;让我想起当年大学的时候信安三勇中的两勇的课&#xff0c;一门密码学&#xff0c;一门数学基础&#xff0c;可怕之极。这个题网上writeup一大堆&#xff0c;但是在一些方面解释的不是很详细…

实验吧-简单的登录题

前言 这是在实验吧上面的一道web题。主要考察cbc字节反转攻击。 分析 题目开始就是输入id去登录 首先想到的就是sql注入了,输入1后页面显示Hello,重新载入的话页面返回报错信息 确实存在注入,看那后面的逗号,猜测注入点在limit后面。然后试了很多,发现题目把union,#…

前端框架是什么意思?

说起前端框架&#xff0c;很多人都不知道是什么意思&#xff0c;下面本篇文章就来给大家介绍一下前端框架是什么意思&#xff1f;希望对大家有所帮助。 前端框架是什么意思&#xff1f; 前端框架一般指用于简化网页设计的框架&#xff0c;使用广泛的前端开发套件&#xff0c;比…

优秀的前端开发框架

优秀的前端开发框架 1.Vue Vue2文档&#xff1a;Vue.js Vue3文档&#xff1a;Vue.js - 渐进式 JavaScript 框架 | Vue.js 用于构建用户界面的渐进式框架 Vue的核心库只关注视图层。可与elementUI配合Element - The worlds most popular Vue UI framework 2.React 原先的Fa…