分析修改ELF目标文件(2)

上一节我们得到了可执行程序 main,执行后输出如下

[root@izbp1irxwqt7ei21awv6wvz reloc]# ./main 
10+12=22

现在我们实现一个小目标,让上面的输出变为 10+12=24。从下面的伪代码可以看出

#include <stdio.h>
char *fmt = "10+12=22\n";
char *fmt1 = "hello world\n";
int age = 26;
int num;
int add(int a, int b) {
    return a+b;
}
int main(){
    add(10,12);
    printf(fmt);
    return 0;
}

程序最终输出的就是 fmt 变量,而该变量的值肯定存在于数据段的 .data 节里

首先我们打印出节头

[root@izbp1irxwqt7ei21awv6wvz reloc]# readelf -S main
There are 9 section headers, starting at offset 0x12c8:

Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [ 0]                   NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
  [ 1] .text             PROGBITS         00000000004000f0  000000f0
       000000000000004d  0000000000000000  AX       0     0     16
  [ 2] .eh_frame         PROGBITS         0000000000400140  00000140
       0000000000000038  0000000000000000   A       0     0     8
  [ 3] .data             PROGBITS         0000000000601000  00001000
       0000000000000020  0000000000000000  WA       0     0     4
...

可以得知 .data 节在文件偏移为0x1000处,总大小为 0x20

我们再通过 od 打印出整个二进制文件main

[root@izbp1irxwqt7ei21awv6wvz reloc]# od -Ax -tx1z main
...
001000 31 30 2b 31 32 3d 32 32 0a 68 65 6c 6c 6f 20 77  >10+12=22.hello w<
001010 6f 72 6c 64 0a 1a 00 00 00 00 00 00 02 00 00 00  >orld............<
001020 ...

从上面输出我们可以很容易得出,只要修改 0x1007 处的 0x32 为 0x34 即可

下面是具体修改步骤

此时运行就成功了

[root@izbp1irxwqt7ei21awv6wvz reloc]# ./main 
10+12=24

到这里,我们已经是一个linux 二进制的黑客了,虽然有点初级

这里不妨可以猜测一下,假设我们要在一个可执行程序里注入自己的代码,往简单点想就是在代码段拼接上自己的代码,在数据段拼接上自己的数据,然后再修改里面所有影响到的偏移数据即可

上一篇: 分析修改ELF目标文件(1)
下一篇: 分析修改ELF目标文件(3)
作者邮箱: 203328517@qq.com