繁体   English   中英

混淆的C / asm“ Hello,world!”程序,我听不懂

[英]obfuscated C/asm “Hello, world!” program, I don't understand

为什么以下代码显示“ Hello,world!” (在“我的”系统上)?

        .file   "test.c"
.globl main
        .data
        .align 32
        .type   main, @object
        .size   main, 56
main:
        .value  3816
        .value  0
        .value  18432
        .value  27749
        .value  28524
        .value  8236
        .value  28535
        .value  27762
        .value  8548
        .value  -29942
        .value  9228
        .value  7305
        .value  -17884
        .value  14
        .value  0
        .value  20818
        .value  443
        .value  0
        .value  21248
        .value  1208
        .value  0
        .value  -32000
        .value  1260
        .value  -32563
        .value  -15229
        .value  23312
        .value  -16335
        .value  -28477

另外, .value是什么意思,它将如何转换为机器代码?

我组装了它,然后拆解了,这就是我得到的。 我没有运行它,因为我比运行网上发现的随机汇编语言要了解的多。

该代码首先跳转到打印代码:

00000000 <main>:
   0:   e8 0e 00 00 00          call   13 <main+0x13>

然后遵循“ Hello,World!\\ n”的ASCII:

   5:   48 65 6c 6c 6f 2c 20
   c:   77 6f 72 6c 64 21 0a

代码在第一条指令中跳转到:

  13:   8b 0c 24                mov    (%esp),%ecx
  16:   89 1c 24                mov    %ebx,(%esp)
  19:   ba 0e 00 00 00          mov    $0xe,%edx
  1e:   52                      push   %edx
  1f:   51                      push   %ecx
  20:   bb 01 00 00 00          mov    $0x1,%ebx
  25:   53                      push   %ebx
  26:   b8 04 00 00 00          mov    $0x4,%eax
  2b:   83 ec 04                sub    $0x4,%esp
  2e:   cd 80                   int    $0x80
  30:   83 c4 10                add    $0x10,%esp
  33:   5b                      pop    %ebx
  34:   31 c0                   xor    %eax,%eax
  36:   c3                      ret
  37:   90                      nop

FWIW,使用的方法是将代码粘贴到文件foo.S ,然后:

gcc -S foo.S
objdump -D foo.o

这看起来像汇编代码。 需要指出的一些关键事项是

  1. “ .globl main”:此伪指令告诉装配员使main的符号在此汇编文件之外可见。
  2. “ main:”:这将创建符号main,链接器知道在链接时要查找该符号
  3. “ .value”:这使汇编程序发出带有相应值的字节。

在这种情况下,剩下的技巧是将所发出的字节转换为它们所对应的指令。 可以使用“英特尔64和IA-32体系结构软件开发人员手册:第2B卷”中的操作码映射来完成此操作,可从此处获得

.value是原始内存数据。 它们本身就是机器代码。 该文件包含的程序不是人类可读的助记符,而是十进制数(看起来像两个字节的带符号数字)。如果您希望将程序视为可读代码,请对其进行编译并使用任何反汇编程序。

.value未转换为机器代码。 这是一个汇编程序指令。

.globl指令导出主要符号。 这是很典型的,因为main必须对链接器是公开可见的。 .data指令从可执行文件的数据段开始,然后将main声明为大小为56的对象,因为有28个.value语句,每个语句表示一个16位值。

.value之后指定的数字似乎是原始二进制值,代表已翻译的指令。 它将需要您的操作系统和处理器的知识才能进一步确定它们的含义。

希望能有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM