gpt4 book ai didi

c - 如何将包含 32 位 asm 的 C 程序编译成 .o 文件?

转载 作者:太空宇宙 更新时间:2023-11-04 01:20:06 24 4
gpt4 key购买 nike

简介

我正在阅读“学习 Linux 二进制分析”一书。我有一些使用 32 位汇编和 C 的经验(但仍然认为自己是新手)。然而,我在如何编译一个包含 32 位程序集的 c 程序到目标文件 .o 方面遇到了麻烦和困惑。所以我猜这只是我的编译问题。

源代码是基于代码注入(inject)的二进制补丁示例的一部分。

源代码

#include <sys/syscall.h>
int _write (int fd, void *buf, int count)
{
long ret;
__asm__ __volatile__ ("pushl %%ebx\n\t"
"movl %%esi,%%ebx\n\t"
"int $0x80\n\t""popl %%ebx":"=a" (ret)
:"0" (SYS_write), "S" ((long) fd),
"c" ((long) buf), "d" ((long) count));
if (ret >= 0) {
return (int) ret;
}
return -1;
}
int evil_puts(void)
{
_write(1, "HAHA puts() has been hijacked!\n", 31);
}

问题

我试图将 evil_puts.c 编译成 .o 文件。稍后将用于注入(inject)到另一个简单程序中。

gcc -c evil_puts.c

evil_puts.c: Assembler messages:

evil_puts.c:5: Error: invalid instruction suffix for `push'

evil_puts.c:8: Error: invalid instruction suffix for `pop'

我以前在用气体处理 32 组件时收到过这个。为了解决这个问题,我在编译和链接时放置了“-32”标志。我猜哪个是问题所在?但是不完全确定,如果是这种情况,不知道如何使用 C 和 gcc 在 32 位中编译它?

我还尝试将每个命令的“l”替换为“q”并将寄存器更改为以“r”开头,从而将其更改为 64 位以查看它是否可行。这似乎有效。但是这本书使用 32 位。所以我希望保持这种状态。有任何想法吗?抱歉,如果这是一个非常基本的问题。

也试过 '-m32' 但收到这个:

fatal error: sys/syscall.h: No such file or directory

最佳答案

使用 gcc -m32 -c evil_puts.c -o evil_puts.o

您收到该错误是因为您没有安装 32 位库。

如果使用 Ubuntu:

sudo apt-get install gcc-multilib

关于c - 如何将包含 32 位 asm 的 C 程序编译成 .o 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46207750/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com