[英]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
這看起來像匯編代碼。 需要指出的一些關鍵事項是
在這種情況下,剩下的技巧是將所發出的字節轉換為它們所對應的指令。 可以使用“英特爾64和IA-32體系結構軟件開發人員手冊:第2B卷”中的操作碼映射來完成此操作,可從此處獲得
.value
是原始內存數據。 它們本身就是機器代碼。 該文件包含的程序不是人類可讀的助記符,而是十進制數(看起來像兩個字節的帶符號數字)。如果您希望將程序視為可讀代碼,請對其進行編譯並使用任何反匯編程序。
.value未轉換為機器代碼。 這是一個匯編程序指令。
.globl指令導出主要符號。 這是很典型的,因為main必須對鏈接器是公開可見的。 .data指令從可執行文件的數據段開始,然后將main聲明為大小為56的對象,因為有28個.value語句,每個語句表示一個16位值。
.value之后指定的數字似乎是原始二進制值,代表已翻譯的指令。 它將需要您的操作系統和處理器的知識才能進一步確定它們的含義。
希望能有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.