我尝试将我的C代码转换为GCC汇编(通过键入gcc -S -masm=intel或pg.c或gcc -S prog.c),但它给了我MASM代码,虽然我需要NASM一个。我想知道你是否可以帮助我将我的C转换为NASM汇编。
sbdsn5lh1#
在此解释如下:如何在Linux上从C源代码生成一个nasm可编译的汇编代码?但是我会给予你一个完整的解释。一步一步:
步骤1:写你好.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
步骤3:反汇编目标文件
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 .
您需要删除“function”(第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
附件1安装objconv:
你想用Nasm编写好的程序,也许可以看看这个包里的例子:http://sourceforge.net/projects/nasmx
gkl3eglg2#
这个问题有点不清楚,但是你可以通过在调试器中打开你的C可执行文件并复制相关的代码来完成。如果你想找的是“Shellcode”,那么你就可以找到它。但是,如果您计划将一个成熟的C代码转换为NASM,您应该使用MASM代码并为NASM重新布线。
cnjp1d6j3#
虽然这是一个解决OP问题的间接方法,但它可能会对某些人有用。一个python脚本用于将MASM转换为NASM:哎呀!看起来脚本超出了“stackoverflow”的字符限制,所以我不得不删除它。这里是直接下载链接:MASM to NASM下载的参考网页:masm32.com
3条答案
按热度按时间sbdsn5lh1#
在此解释如下:如何在Linux上从C源代码生成一个nasm可编译的汇编代码?但是我会给予你一个完整的解释。一步一步:
步骤1:写你好.c:
步骤2:创建目标文件:
步骤3:反汇编目标文件
看到最后安装objconv,你真的需要它,因为objdumb(安装在linux上)只输出一个人类可读的和长长的输出。现在让我们看看hello.asm:
您需要删除“function”(第8行)和所有的“align=?noexecute”,其中?表示数字。
步骤4组装:
附件1安装objconv:
附件2
你想用Nasm编写好的程序,也许可以看看这个包里的例子:http://sourceforge.net/projects/nasmx
gkl3eglg2#
这个问题有点不清楚,但是你可以通过在调试器中打开你的C可执行文件并复制相关的代码来完成。如果你想找的是“Shellcode”,那么你就可以找到它。
但是,如果您计划将一个成熟的C代码转换为NASM,您应该使用MASM代码并为NASM重新布线。
cnjp1d6j3#
虽然这是一个解决OP问题的间接方法,但它可能会对某些人有用。一个python脚本用于将MASM转换为NASM:哎呀!看起来脚本超出了“stackoverflow”的字符限制,所以我不得不删除它。
这里是直接下载链接:MASM to NASM
下载的参考网页:masm32.com