使用 objdump 或 gcc -c 将汇编指令转换为二进制

Posted

技术标签:

【中文标题】使用 objdump 或 gcc -c 将汇编指令转换为二进制【英文标题】:Converting assembly instructions to binary using objdump or gcc -c 【发布时间】:2013-12-09 20:49:44 【问题描述】:

我正在研究缓冲炸弹实验室,但我被困在一件事上。我已经编写了我的漏洞利用代码来解决级别 2(鞭炮),但我不确定如何使用 gcc -c 将其转换为原始形式。 我从未编写过可编译的汇编文件,但我自己编写了指令并跟踪了已经编写的指令。所以我知道它们是如何工作的,但我不确定如何在语法上编写代码文件本身。

这是我试图转换为原始格式的文件的当前内容:

movl $0x1a4bb386, 0x804d200
push $0x0804915f 
ret

我需要添加什么才能使用gcc -cobjdump -d 进行编译? 我需要弄清楚这些指令占用了多少字节以及如何将它们插入缓冲区,以便编写缓冲区溢出漏洞。

谢谢。

【问题讨论】:

您需要阅读有关 GNU 汇编程序或 GAS 的信息。您还可以将汇编代码内嵌到 C 代码中。 我不认为您的第一条指令在 x86 芯片组上是有效的。你有没有想过下载英特尔自己的非常详细的处理器手册?它包含所有助记符及其参数的描述,以及它们的十六进制表示法。 应该是movl....编译好了。谢谢 我已经发布了一个答案,但我还有一个问题,请参考下面...谢谢。 【参考方案1】:

使用 gcc -m32 -c code.s 编译

输出是一个文件代码。o

我使用 objdump -d code.o > code.asm 来获取所需的原始程序集和字节。

输出:

code.o:     file format elf32-i386


Disassembly of section .text:

00000000 <.text>:
   0:   c7 05 00 d2 04 08 86    movl   $0x1a4bb386,0x804d200
   7:   b3 4b 1a
   a:   68 5f 91 04 08          push   $0x804915f
   f:   c3                      ret

我很好奇该指令在 VA 0x7 处做了什么……这只是指令 movl 的其余部分吗?

【讨论】:

这不是单独的指令。指令有两个字节,0xc7、0x05; 4 个字节用于小端格式的地址,然后是 4 个字节的另一个小端地址。出于某种奇怪的原因,程序集列表仅显示每行最多 7 个字节。

以上是关于使用 objdump 或 gcc -c 将汇编指令转换为二进制的主要内容,如果未能解决你的问题,请参考以下文章

这是汇编程序错误吗?绑定指令

反汇编工具使用

反汇编工具objdump的使用以及反汇编文件的解读

如何使用 objdump 反汇编一个函数?

IBM AIX 中 objdump 的等效命令是啥

C++学习(三九六)如何查看.o文件