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

相关文章

使用Java将实体类转换为JSON并输出到控制台的完整过程

《使用Java将实体类转换为JSON并输出到控制台的完整过程》在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用JSON格式,用Java将实体类转换为J... 在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用j

基于Go语言实现Base62编码的三种方式以及对比分析

《基于Go语言实现Base62编码的三种方式以及对比分析》Base62编码是一种在字符编码中使用62个字符的编码方式,在计算机科学中,,Go语言是一种静态类型、编译型语言,它由Google开发并开源,... 目录一、标准库现状与解决方案1. 标准库对比表2. 解决方案完整实现代码(含边界处理)二、关键实现细

MySQL中的两阶段提交详解(2PC)

《MySQL中的两阶段提交详解(2PC)》:本文主要介绍MySQL中的两阶段提交(2PC),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录引言两阶段提交过程sync_binlog配置innodb_flush_log_at_trx_commit配置总结引言在Inn

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

java字符串数字补齐位数详解

《java字符串数字补齐位数详解》:本文主要介绍java字符串数字补齐位数,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java字符串数字补齐位数一、使用String.format()方法二、Apache Commons Lang库方法三、Java 11+的St

VSCode中C/C++编码乱码问题的两种解决方法

《VSCode中C/C++编码乱码问题的两种解决方法》在中国地区,Windows系统中的cmd和PowerShell默认编码是GBK,但VSCode默认使用UTF-8编码,这种编码不一致会导致在VSC... 目录问题方法一:通过 Code Runner 插件调整编码配置步骤方法二:在 PowerShell

python多种数据类型输出为Excel文件

《python多种数据类型输出为Excel文件》本文主要介绍了将Python中的列表、元组、字典和集合等数据类型输出到Excel文件中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一.列表List二.字典dict三.集合set四.元组tuplepython中的列表、元组、字典

Spring AI集成DeepSeek实现流式输出的操作方法

《SpringAI集成DeepSeek实现流式输出的操作方法》本文介绍了如何在SpringBoot中使用Sse(Server-SentEvents)技术实现流式输出,后端使用SpringMVC中的S... 目录一、后端代码二、前端代码三、运行项目小天有话说题外话参考资料前面一篇文章我们实现了《Spring

Python如何实现读取csv文件时忽略文件的编码格式

《Python如何实现读取csv文件时忽略文件的编码格式》我们再日常读取csv文件的时候经常会发现csv文件的格式有多种,所以这篇文章为大家介绍了Python如何实现读取csv文件时忽略文件的编码格式... 目录1、背景介绍2、库的安装3、核心代码4、完整代码1、背景介绍我们再日常读取csv文件的时候经常