簡體   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