csapp-linklab之第5阶段“输出编码后的学号”(补齐残缺的重定位表)

2023-12-03 14:52

本文主要是介绍csapp-linklab之第5阶段“输出编码后的学号”(补齐残缺的重定位表),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实验内容

修改补充phase5.o重定位节中被清零的重定位记录,使其与main.o链接后能够正确输出学号编码后的字符串: $ gcc -o linkbomb main.o phase5.o $ ./linkbomb $学号编码后字符串

实验提示

仅需修改重定位节的内容。 不允许修改.text节内容。

给出的C代码

const int TRAN_ARRAY[] = {… …}; // 通过反汇编代码+重定位表,得知此数组真实名字叫fEgeEF
const char FDICT[] = FDICTDAT;
char BUF[] = MYID; 
char CODE = PHASE5_COOKIE;int transform_code( int code, int mode )  {switch( TRAN_ARRAY [mode] & 0x00000007 )  {case 0:code = code & (~ TRAN_ARRAY[mode]);break;case 1:code = code ^ TRAN_ARRAY[mode];break;… …}return code;
}void generate_code( int cookie )  {int i;CODE = cookie;for( i=0; i<sizeof(TRAN_ARRAY)/sizeof(int); i++ )CODE = transform_code( CODE, i );
}int encode( char* str )  {int i, n = strlen(str);for( i=0; i<n; i++ ) {str[i] = (FDICT[str[i]] ^ CODE) & 0x7F;if( str[i]<0x20 || str[i]>0x7E ) str[i] = ' ';}return n;
}void do_phase()  {generate_code(PHASE5_COOKIE);encode(BUF);printf("%s\n", BUF);
}

粗略分析

重定位表

 

 符号表

 完全会写重定位表之后,去phase5.s中看哪些重定位的地方被抹去了

找到被抹去的地方(8个)

9处

对应C代码:  switch( TRAN_ARRAY [mode] & 0x00000007 )   中的 TRAN_ARRAY [xxx]、

重定位到:fEgeEF(9)

3d处

对应C代码: case=3的情况(C代码没有给出,但根据上下文可知道类似)

重定位到:fEgeEF(9)

【注意】不是看见一串可疑的00 00 00 00、ffffffff 就是要重定位,要对照C代码的。有时候人家就是要给局部变量清零,那显然不是重定位。比如92处,明显是个循环变量,对应C代码为  for( i=0; i<sizeof(TRAN_ARRAY)/sizeof(int); i++ )中的i=0

还有dc处也是循环变量

9b处

对应C代码:  transform_code( CODE, i ); 将code给ax

重定位到:CODE(12)

a7处

对应C:调用 transform_code( CODE, i );

重定位到: transform_code(13)

fb处

str[i] = (FDICT[str[i]] ^ CODE) & 0x7F;中的FDICT(真实名字:qbivHB)(10)

102处

str[i] = (FDICT[str[i]] ^ CODE) & 0x7F;中的

CODE(12)

163处

C:调用encode(BUF); 调用函数,应该是PC相对寻址

重定位到:encode(PC相对)(15)

16e处

C:把BUF的首地址压栈传参(C代码是printf("%s\n", BUF); )(疑问,为什么源代码是printf,汇编之后就成了puts)传递数据,应该是绝对寻址

重定位到:BUF(绝对)(11)

 补全.rel.text

重定位节从0x524开始。用hexedit打开phase5.o

改写

每个重定位条目由8字节组成。

前4字节:代码位置。

后4字节:寻址方式(01或02)在符号表的编号 00 00

改成这样↓

结束

这篇关于csapp-linklab之第5阶段“输出编码后的学号”(补齐残缺的重定位表)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/449845

相关文章

使用TomCat,service输出台出现乱码的解决

《使用TomCat,service输出台出现乱码的解决》本文介绍了解决Tomcat服务输出台中文乱码问题的两种方法,第一种方法是修改`logging.properties`文件中的`prefix`和`... 目录使用TomCat,service输出台出现乱码问题1解决方案问题2解决方案总结使用TomCat,

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

Python使用Colorama库美化终端输出的操作示例

《Python使用Colorama库美化终端输出的操作示例》在开发命令行工具或调试程序时,我们可能会希望通过颜色来区分重要信息,比如警告、错误、提示等,而Colorama是一个简单易用的Python库... 目录python Colorama 库详解:终端输出美化的神器1. Colorama 是什么?2.

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

form表单提交编码的问题

浏览器在form提交后,会生成一个HTTP的头部信息"content-type",标准规定其形式为Content-type: application/x-www-form-urlencoded; charset=UTF-8        那么我们如果需要修改编码,不使用默认的,那么可以如下这样操作修改编码,来满足需求: hmtl代码:   <meta http-equiv="Conte

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern