【发布时间】:2018-02-05 03:53:01
【问题描述】:
我已经开始学习 NASM 汇编器和 RE。我遇到的第一个问题是下一个(简而言之):
我无法使用objconv实用程序恢复反编译的程序。
我的简单应用:
#include <stdio.h>
char* msg = "Hello World!";
int main(void) {
printf("%s\r\n", msg);
return 0;
}
1)。我所做的第一步是:
gcc -fno-asynchronous-unwind-tables -s -c -o 1.o 1.c
标志:fno-asynchronous-unwind-tables 用于不在输出目标文件中生成不必要的部分。
2)。然后,我以这种方式使用了objconv 实用程序:
objconv -fnasm 1.o
为了生成NASM 汇编器的汇编代码,我有下一个:
; Disassembly of file: 1.o
; Sun Aug 27 23:56:53 2017
; Mode: 64 bits
; Syntax: YASM/NASM
; Instruction set: 8086, x64
default rel
global main: function
global msg
extern printf ; near
SECTION .text align=1 execute ; section number 1, code
main: ; Function begin
push rbp ; 0000 _ 55
mov rbp, rsp ; 0001 _ 48: 89. E5
mov rax, qword [rel msg] ; 0004 _ 48: 8B. 05, 00000000(rel)
mov rsi, rax ; 000B _ 48: 89. C6
mov edi, ?_001 ; 000E _ BF, 00000000(d)
mov eax, 0 ; 0013 _ B8, 00000000
call printf ; 0018 _ E8, 00000000(rel)
mov eax, 0 ; 001D _ B8, 00000000
pop rbp ; 0022 _ 5D
ret ; 0023 _ C3
; main End of function
SECTION .data align=8 noexecute ; section number 2, data
msg: ; qword
dq Unnamed_4_0 ; 0000 _ 0000000000000000 (d)
SECTION .bss align=1 noexecute ; section number 3, bss
SECTION .rodata align=1 noexecute ; section number 4, const
db 48H, 65H, 6CH, 6CH, 6FH, 20H, 57H, 6FH ; 0000 _ Hello Wo
db 72H, 6CH, 64H, 21H, 00H ; 0008 _ rld!.
?_001: ; byte
db 25H, 73H, 0DH, 0AH, 00H ; 000D _ %s...
3)。下一步是:
删除不必要的部分,例如:
-
.SECTION行中的 align=N 和 execute/noexecute 词 -
: function来自 global 声明 -
default rel行
修复msg: dq Unnamed_4_0。我曾想过,这部分在使用objconv 后相当受损/损坏。
所以,我改变了:
dq Unnamed_4_0
到:
db "Hello World",10
尽管有以下部分:.rodata(我在想,我的问题完全在于不正确地使用字符串进行输出......)。
4)。然后我在 shell 中使用了下一个命令:
nasm -f elf64 1.asm
gcc 1.o
当我在 gcc 之后启动 a.out 文件时,出现下一个错误:
user@:~/Desktop/tmp$ ./a.out
Segmentation fault (core dumped)
这就是我无法从反汇编程序中恢复原始行为的原因。原程序通过以下方式编译:
gcc -std=c99 -o 1 1.c
它的源代码在我的问题开始时发布。我想要实现的目标很简单:使用objconv -> nasm 方法构建可执行文件,它充当原始可执行文件。
【问题讨论】:
-
你是在反汇编,而不是反编译。这通常是不安全的,因为 NASM 语法不能代表不同的指令编码选择,例如在 PLT 中留下必要的填充。如果你只是保留反汇编的
main,那应该没问题。可能你弄坏了一些东西,你应该使用gdb ./a.out找出是什么。 (请参阅the x86 tag wiki 底部的 gdb 以获取 asm 提示。) -
@PeterCordes 感谢您的良好和建设性的回答
标签: gcc x86 nasm reverse-engineering disassembly