使用 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 -c
或objdump -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 将汇编指令转换为二进制的主要内容,如果未能解决你的问题,请参考以下文章