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

相关文章

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

CSS Anchor Positioning重新定义锚点定位的时代来临(最新推荐)

《CSSAnchorPositioning重新定义锚点定位的时代来临(最新推荐)》CSSAnchorPositioning是一项仍在草案中的新特性,由Chrome125开始提供原生支持需... 目录 css Anchor Positioning:重新定义「锚定定位」的时代来了! 什么是 Anchor Pos

使用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编码的应用场景注意