GNU binutils系列(编译与反编译)
汇编器-as
汇编器-nasm
链接器-ld
二进制文件分析工具-readelf
反汇编工具-objdump
常见的汇编代码分为AT&T风格(目的操作数在右)和Intel风格(目的操作数在左)两种
- 给定一个二进制文件,我们可以使用反编译工具得到他们的汇编代码,如
objdump
。- 默认情况下
objdump -d myhelloworld
生成AT&T风格的汇编 objdump
提供--intel
选项,支持生成Intel风格的汇编
- 默认情况下
objdump的一般使用
objdump -d <binary-file>
-d
:表示disassemble
反汇编- 直接使用
objdump
反汇编全部的二进制文件,结果可能比较大,不方便看。可以结合其他工具进一步分析。
图形化反编译工具有
IDA
和Ghidra
,一键F5相当方便。
- 如果要反编译某个函数,可以使用
gdb
的disassemble
功能。当然,gdb
的disassemble
不仅仅用于反编译函数,还有其他使用技巧,如指定地址范围、反编译当前指令处的代码($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
-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
查看函数名这种方式不够简洁。更推荐使用readelf
、nm
、以及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 *);
-r
:输出重定位表内容
ouc@islouc-vm:~/attacklab$ objdump -r ctarget
ctarget: file format elf64-x86-64
objdump与漏洞利用
在漏洞利用中,可以手动编写汇编指令片段(
myshellcode.asm
文件),使用汇编工具(nasm
或as
)生成对应的机器码(myshellcode.o
文件)。我们可以使用objdump -d myshellcode.o
提取这些机器码。
GNU Debugger
gdb
gdb 远程调试怎么搞
gdb插件 pwndbg