5

我尝试通过 gcc 将我的 c 代码转换为汇编(通过键入 gcc -S -masm=intel 或 pg.c 或 gcc -S prog.c),但它给了我 masm 代码,但我需要 nasm 一个。我想知道你是否可以帮助我将我的 c 转换为 nasm 程序集

4

2 回答 2

15

这里解释:如何在 Linux 上从 c 源代码生成 nasm 可编译的汇编代码?但我会给你一个完整的解释。一步步 :


第 1 步:编写 hello.c:

#include <stdio.h>
int main()
{
printf( "Hello World \n" );
return 0;
}

第 2 步:创建目标文件:

gcc -fno-asynchronous-unwind-tables -s -c -o hello.o hello.c

第三步:反汇编目标文件

objconv -fnasm hello.o   #this creates hello.asm

看到最后安装objconv,你真的需要它,因为objdumb(安装在linux上)只输出人类可读的长长输出。现在让我们看看 hello.asm :

; Disassembly of file: hello.o
; Mon Dec  1 13:08:02 2014
; Mode: 32 bits
; Syntax: YASM/NASM
; Instruction set: 80386


global main: function

extern puts                                             ; near 


SECTION .text   align=4 execute                         ; section number 1, code

main:   ; Function begin
    push    ebp                                     ; 0000 _ 55
    mov     ebp, esp                                ; 0001 _ 89. E5
    and     esp, 0FFFFFFF0H                         ; 0003 _ 83. E4, F0
    sub     esp, 16                                 ; 0006 _ 83. EC, 10
    mov     dword [esp], ?_001                      ; 0009 _ C7. 04 24, 00000000(d)
    call    puts                                    ; 0010 _ E8, FFFFFFFC(rel)
    mov     eax, 0                                  ; 0015 _ B8, 00000000
    leave                                           ; 001A _ C9
    ret                                             ; 001B _ C3
; main End of function


SECTION .data   align=4 noexecute                       ; section number 2, data


SECTION .bss    align=4 noexecute                       ; section number 3, bss


SECTION .rodata align=1 noexecute                       ; section number 4, const

?_001:                                                  ; byte
    db 48H, 65H, 6CH, 6CH, 6FH, 20H, 57H, 6FH       ; 0000 _ Hello Wo
    db 72H, 6CH, 64H, 20H, 00H                      ; 0008 _ rld .

您需要删除“函数”(第 8 行)和所有“align=? noexecute”在哪里?代表一个数字。


第 4 步组装:

nasm -f elf hello.asm #This creates a new hello.o, actually the same :) 
gcc hello.o -o hello   # this creates a binary hello, use gcc and no ld because of the call of external functions
./hello   # output : hello world 

Anexe 1安装 objconv :

  • 转到此站点http://www.agner.org/optimize/#objconv
  • 点击下载并解压objconv.zip
  • 解压 source.zip 并为 linux 运行 build.sh(为 window 运行 objconv.exe),这将创建一个可执行的 objconv
  • 将 objconv 移动到你的二进制文件(现在就做!!)或者只是运行 ./objconv (如果你不被允许,你可能必须在之前运行 chmod 777 objconv)

附件2

你想在 Nasm 中制作好的程序,也许可以看到这个包中的例子:http: //sourceforge.net/projects/nasmx

于 2014-12-01T16:23:49.583 回答
1

问题有点不清楚,但或多或​​少您可以通过在调试器中打开您的 c 可执行文件并复制相关代码来做到这一点。如果那是您正在寻找的,那将为您提供“Shellcode”。

但是,如果您打算将完整的 C 代码转换为 NASM,您应该使用该 MASM 代码并将其重新连接为 NASM。

于 2013-08-05T20:42:09.010 回答