assembly 对C对象文件实施反向工程

egdjgwm8  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(147)

我正在练习对C语言的目标文件进行逆向工程。假设我有一个C程序的目标文件:

#include <stdio.h>
#include <string.h>

int main (int argc, char ** argv) {
  char * input = argv[1];
  int result = strcmp(input, "text_to_compare");
  
  if (result == 0) {
      printf("%s\n", "text matches");
  }
  else {
      printf("%s\n", "text doeesn't match");
  }
  
  return 0;
}

如果目标文件是使用-g标志和x86-64架构编译的,我将如何从目标文件中找到“text_to_compare”?

twh00eeo

twh00eeo1#

在二进制文件上运行strings将在文件中显示四个或更多可打印字符的所有序列。对于简单的文件,这可能足够了,但对于较大的文件,您可能会以大量误报告终。例如,使用gcc编译代码并在生成的二进制文件上运行strings将返回295个结果。
我们可以先使用objdump命令来反汇编示例文件中的代码:

$ objdump --disassemble=main a.out

a.out:     file format elf64-x86-64

Disassembly of section .init:

Disassembly of section .plt:

Disassembly of section .text:

0000000000401136 <main>:
  401136:       55                      push   %rbp
  401137:       48 89 e5                mov    %rsp,%rbp
  40113a:       48 83 ec 20             sub    $0x20,%rsp
  40113e:       89 7d ec                mov    %edi,-0x14(%rbp)
  401141:       48 89 75 e0             mov    %rsi,-0x20(%rbp)
  401145:       48 8b 45 e0             mov    -0x20(%rbp),%rax
  401149:       48 8b 40 08             mov    0x8(%rax),%rax
  40114d:       48 89 45 f8             mov    %rax,-0x8(%rbp)
  401151:       48 8b 45 f8             mov    -0x8(%rbp),%rax
  401155:       be 10 20 40 00          mov    $0x402010,%esi
  40115a:       48 89 c7                mov    %rax,%rdi
  40115d:       e8 de fe ff ff          call   401040 <strcmp@plt>
  401162:       89 45 f4                mov    %eax,-0xc(%rbp)
  401165:       83 7d f4 00             cmpl   $0x0,-0xc(%rbp)
  401169:       75 0c                   jne    401177 <main+0x41>
  40116b:       bf 20 20 40 00          mov    $0x402020,%edi
  401170:       e8 bb fe ff ff          call   401030 <puts@plt>
  401175:       eb 0a                   jmp    401181 <main+0x4b>
  401177:       bf 2d 20 40 00          mov    $0x40202d,%edi
  40117c:       e8 af fe ff ff          call   401030 <puts@plt>
  401181:       b8 00 00 00 00          mov    $0x0,%eax
  401186:       c9                      leave
  401187:       c3                      ret

Disassembly of section .fini:

查看反汇编,我们可以看到对偏移量为40115d的strcmp的调用:

40115d:       e8 de fe ff ff          call   401040 <strcmp@plt>

如果我们看一下前面的几行,我们可以看到一条指令正在将数据从这个部分之外的地址(0x402010)移动:

401155:       be 10 20 40 00          mov    $0x402010,%esi

如果我们查看objdump -h a.out的输出,我们会发现该地址福尔斯.rodata部分(我们正在查找给定地址位于从VMA列中的地址开始的内存块中的部分):

$ objdump -h a.out
Idx Name          Size      VMA               LMA               File off  Algn
[...]
 15 .rodata       00000041  0000000000402000  0000000000402000  00002000  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
[...]

我们可以使用objcopy命令提取该部分中的数据:

$ objcopy -j .rodata -O binary a.out >(xxd -o 0x402000)
00402000: 0100 0200 0000 0000 0000 0000 0000 0000  ................
00402010: 7465 7874 5f74 6f5f 636f 6d70 6172 6500  text_to_compare.
00402020: 7465 7874 206d 6174 6368 6573 0074 6578  text matches.tex
00402030: 7420 646f 6565 736e 2774 206d 6174 6368  t doeesn't match
00402040: 00                                       .

我们可以看到地址为0x402010的字符串是text_to_compare

相关问题