[英]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.