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