模糊的C / asm“你好,世界!”程序,我不明白

时间:2010-06-21 16:17:10

标签: c assembly obfuscation

为什么以下代码打印“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是什么意思,它将如何转换为机器代码?

4 个答案:

答案 0 :(得分:5)

我把它组装好然后拆开它,这就是我得到的。我没有运行它,因为我知道比在网上运行随机的汇编语言更好。

代码首先分支到打印代码:

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

然后按照ASCII“Hello,World!\ n”:

   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 :(得分:2)

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

  1. “。globl main”:该指令告诉assmbler在此程序集文件外部显示main的符号。
  2. “main:”:这将创建符号main,链接器在链接时知道要查找
  3. “。value”:这会导致汇编程序发出一个具有相应值的字节。
  4. 鉴于此,剩下的技巧是将emmited的字节转换为它们对应的指令。这可以使用“英特尔64和IA-32架构软件开发人员手册:第2B卷”中的操作码映射来完成,可从here获得

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

.value之后指定的数字似乎是表示已翻译指令的原始二进制值。需要了解您的操作系统和处理器才能进一步确定其含义。

希望有所帮助。