然后需要修改program header table中所有属于text节区所在段的 其他段(文件偏移大于text节区原结束地址的)的文件偏移。对于此例,因为PT_GNU_RELRO段在此text节区所在的PT_LOAD段中且其文件偏移大于text节区的原结束地址,所以需要修正其对应的新的文件偏移, 虚拟地址和物理地址。 这样就达到了增加text节区的效果,如...
ELF节 .text节 .text节是保存了程序代码指令的代码节。一段可执行程序,如果存在Phdr ,则.text节就会存在于text段中。由于.text节保存了程序代码,所以节类型为SHT_PROGBITS。 .rodata节 .rodata节保存了只读的数据,如一行C语言代码中的字符串。由于.rodata节是只读的,所以只能存在于一个可执行文件的只读段中。
ELF中可以被修改又不影响执行的区域 看雪上这篇文章讲述了两种对so进行加固的方法:1. 分离section,对整个section进行加密。2.在.text section直接寻找目标函数并进行加密,两种方式的实践代码见文末。 这里讲一些我在学习过程中的一些额外发现,如有理解不对的地方,欢迎斧正。 一. 关于ELF的链接视图和装载视图(执行...
+---+ | ELF Header | 包含文件元信息(如入口点、PHT/SHT 偏移等) +---+ | Program Header Table | PHT,描述 Segments 的加载信息 +---+ | Segment 1 (.text) | 包含代码段 +---+ | Segment 2 (.data) | 包含已初始化的全局和静态变量 +---+ | Segment 3 (.bss) | 包含未初始化的全...
下面我们来分别看看示例程序的.text、.data和.bss节。首先是代码节。可以看到,Contents of section .text部分是.text数据的十六进制形式,总共0x4e个字节,最左边一列是偏移量,中间四列是内容,最右边一列是ASCII码形式。Disassembly of section .text部分则是反汇编的结果。接下来是数据节和只读数据节。可以看到....
.text 节的类型为 SHT_PROGBITS,因为其包含用户定义的代码。同时要注意节的标志,这些标志位指定了该节为可执行的节, 但不可写入。一般来说,可执行的节是不可写的,反之,可写的节一般是不可执行的,因为既可写又可执行的节会让攻击者利用漏洞直接覆盖代码来修改程序。
当前为1,所以得到数据为程序数据。比如.text .data .rodata等等。 sh_flags 表示段的标志,A表示分配的内存、AX表示分配可执行、WA表示分配内存并且可以修改。 sh_addr 加载后程序段的虚拟地址 sh_offset 表示段在文件中的偏移。 sh_size 段的长度
.text 代码跳转修补 使用IDA 反编译 hello IDA 反汇编窗口识别到的汇编指令是已经优化过的,事实上操作系统并不直接感知函数跳转的符号,对于系统来说,只有地址才是真实的。这一点,可以从call _getchar原始指令看出。 call 操作数是一个偏移地址,跳转地址 = 当前指令地址 + 偏移地址。ReverseWidget 的反汇编引擎 Ca...
SimpleSection.o中有一个叫”.rel.text”的段,它的类型(sh_type)为”SHT_REL”,也就是说它是一个重定位表。链接器在处理目标文件时,需要对目标文件中的某些部位进行重定位,即代码段和数据中中那些绝对地址引用的位置。对于每个需要重定位的代码段或数据段,都会有一个相应的重定位表。比如”.rel.text”就是针...
比如:某个程序想要修改.text段中的内容,那么操作系统就会认为这段程序有误而立即终止它的运行,因为系统会把.text段的内存标记为只读。在. bss段中的数据还没有初始化,就没有必要在可执行文件中浪费储存空间。在.bss中只是表明某个变量要使用多少的内存空间,等到程序加载的时候在由内核把这段未初始化的内存空间...