【问题标题】:What is the purpose of the assembly instructions after a function I see with ndisasm?在我使用 ndisasm 看到的功能之后,汇编指令的目的是什么?
【发布时间】:2012-06-04 16:40:22
【问题描述】:

我反汇编了编译非常简单的源文件test.c得到的代码,它看起来像这样:

void main() {}

我运行这些命令将main 函数链接到一个静态可执行文件(编者注:没有 CRT 启动代码,所以它只会崩溃),然后提取到一个平面二进制文件,删除了几个部分,这样我就可以提供到ndisasm(编者注:它不像objdump -drwC -Mintel那样理解ELF元数据)

 gcc -c test.c 
 ld -o test -Ttext 0x0 -e main test.o 
 objcopy -R .note -R .comment -S -O binary test test.bin
 ndisasm -b 32 test.bin

这就是我得到的:

00000000  55                push ebp
00000001  89E5              mov ebp,esp
00000003  5D                pop ebp
00000004  C3                ret
00000005  0000              add [eax],al
00000007  001400            add [eax+eax],dl
0000000A  0000              add [eax],al
0000000C  0000              add [eax],al
0000000E  0000              add [eax],al
00000010  017A52            add [edx+0x52],edi
00000013  0001              add [ecx],al
00000015  7C08              jl 0x1f
00000017  011B              add [ebx],ebx
00000019  0C04              or al,0x4
0000001B  0488              add al,0x88
0000001D  0100              add [eax],eax
0000001F  001C00            add [eax+eax],bl
00000022  0000              add [eax],al
00000024  1C00              sbb al,0x0
00000026  0000              add [eax],al
00000028  D8FF              fdivr st7
0000002A  FF                db 0xff
0000002B  FF05    00000000      inc dword [dword 0x0]
00000031  41                inc ecx
00000032  0E                push cs
00000033  088502420D05      or [ebp+0x50d4202],al
00000039  41                inc ecx
0000003A  0C04              or al,0x4
0000003C  04C5              add al,0xc5
0000003E  0000              add [eax],al

前四行之后的所有内容的目的是什么?为什么要添加到 eax、2*eax、edx+0x52、比较等指向的内存位置?是检查程序是否正确执行还是别的什么?

【问题讨论】:

  • add [eax],al 总是立即让我怀疑。它(几乎)不会出现在实际代码中,尤其是不会那么频繁。
  • 为了详细说明@harold 的评论,add [eax],al 恰好由字节00 00 表示。不知道他们为什么选择该指令由这些字节表示。当您看到该指令时,这些字节很可能是零,而不是希望将 EAX 中最低字节的内容添加到 EAX 指向的地址。通常它实际上并不是被反汇编的代码。

标签: assembly x86 nasm elf disassembly


【解决方案1】:

这部分是.eh_frame,紧跟在.text之后。使用 gcc 编译时可以使用-fno-asynchronous-unwind-tables 去掉它。

更多详情请见Why GCC compiled C program needs .eh_frame section?

【讨论】:

    【解决方案2】:

    我相信你已经反汇编了不是代码的位,这就是为什么它没有多大意义。

    要了解文件可能包含的内容,我建议在 full 二进制文件 (ELF) 上运行 objdump,以查看您是否可以在任何部分。

    【讨论】:

    • 这些是我运行的命令: $gcc -c test.c ; ld -o test -Ttext 0x0 -e main test.o ; objcopy -R .note -R .comment -S -O 二进制测试 test.bin ; ndisasm -b 32 test.bin
    • 谢谢。如果不是代码,那么这些字节最有可能是什么,为什么它们是我的 test.bin 文件的一部分?
    • 是的,或者它可以只是随机数据。
    • 使用 objdump 找到它。它是 .eh_frame 部分,它紧跟在 .text 之后,我没有在运行的 objcopy 命令中使用 -R 将其删除。现在它实际上是有道理的! :)
    猜你喜欢
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 2023-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    相关资源
    最近更新 更多