GNU工具链

Posted by LXH on January 7, 2025

GNU binutils系列(编译与反编译)

汇编器-as

汇编器-nasm

链接器-ld

二进制文件分析工具-readelf

反汇编工具-objdump

常见的汇编代码分为AT&T风格(目的操作数在右)和Intel风格(目的操作数在左)两种

  • 给定一个二进制文件,我们可以使用反编译工具得到他们的汇编代码,如objdump
    • 默认情况下objdump -d myhelloworld生成AT&T风格的汇编
    • objdump提供--intel选项,支持生成Intel风格的汇编
objdump的一般使用
  1. objdump -d <binary-file>
    • -d:表示disassemble反汇编
    • 直接使用objdump反汇编全部的二进制文件,结果可能比较大,不方便看。可以结合其他工具进一步分析。

图形化反编译工具有IDAGhidra,一键F5相当方便。

  • 如果要反编译某个函数,可以使用gdbdisassemble功能。当然,gdbdisassemble不仅仅用于反编译函数,还有其他使用技巧,如指定地址范围、反编译当前指令处的代码($pc)。
# 使用objdump的-D --disassemble=sym
ouc@islouc-vm:~/attacklab$ objdump --disassemble=main ctarget

ctarget:     file format elf64-x86-64


Disassembly of section .init:

Disassembly of section .plt:

Disassembly of section .plt.sec:

Disassembly of section .text:

0000000000401779 <main>:
  401779:       f3 0f 1e fa             endbr64
  40177d:       41 56                   push   %r14
  40177f:       41 55                   push   %r13
  401781:       41 54                   push   %r12

# 使用gdb的disassemble
pwndbg> disassemble main
Dump of assembler code for function main:
   0x0000000000401779 <+0>:     endbr64
   0x000000000040177d <+4>:     push   r14
   0x000000000040177f <+6>:     push   r13
   0x0000000000401781 <+8>:     push   r12
   0x0000000000401783 <+10>:    push   rbp

  1. -t:输出符号表(如:函数名)

ouc@islouc-vm:~/attacklab$ objdump --syms ctarget | grep main
0000000000000000 l    df *ABS*  0000000000000000              main.c
0000000000000000       F *UND*  0000000000000000              __libc_start_main@@GLIBC_2.2.5
0000000000401779 g     F .text  00000000000001f0              main

but,使用objdump查看函数名这种方式不够简洁。更推荐使用readelfnm、以及gdb里的info functions功能

# 使用readelf
ouc@islouc-vm:~/attacklab$ readelf -s ctarget | grep main
    14: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@GLIBC_2.2.5 (2)
    42: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS main.c
   102: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@@GLIBC_
   141: 0000000000401779   496 FUNC    GLOBAL DEFAULT   15 main

# 使用 nm
ouc@islouc-vm:~/attacklab$ nm ctarget |grep main
                 U __libc_start_main@@GLIBC_2.2.5
0000000000401779 T main

# 使用gdb + info functions
pwndbg> info functions touch
All functions matching regular expression "touch":

File visible.c:
24:     void touch1();
39:     void touch2(unsigned int);
70:     void touch3(char *);

  1. -r:输出重定位表内容
ouc@islouc-vm:~/attacklab$ objdump -r ctarget

ctarget:     file format elf64-x86-64
objdump与漏洞利用

在漏洞利用中,可以手动编写汇编指令片段(myshellcode.asm文件),使用汇编工具(nasmas)生成对应的机器码(myshellcode.o文件)。我们可以使用objdump -d myshellcode.o提取这些机器码。

GNU Debugger

gdb

gdb 远程调试怎么搞

gdb插件 pwndbg