bet*_*eta 9 linux assembly gcc glibc
当由一个Linux/i386的系统上GCC生成的ELF可执行文件看,似乎它调用"主"和"NOP"的填充,如在此之前之后alwas放置一个暂停指令(0xF4中):
? ....... ! entrypoint:
? ....... ! xor ebp, ebp
? 80482e2 ! pop esi
? 80482e3 ! mov ecx, esp*emphasized text*
? 80482e5 ! and esp, 0fffffff0h
? 80482e8 ! push eax
? 80482e9 ! push esp
? 80482ea ! push edx
? 80482eb ! push __libc_csu_fini
? 80482f0 ! push __libc_csu_init
? 80482f5 ! push ecx
? 80482f6 ! push esi
? 80482f7 ! push main
? 80482fc ! call wrapper_804a004_80482c4
? 8048301 ! hlt <--- halt instruction
? 8048302 ! nop
? 8048303 ! nop
? 8048304 ! nop
?
Run Code Online (Sandbox Code Playgroud)
这样做的目的是什么?永远不应该达到此代码.这是某种保障措施吗?
ugh*_*fhw 11
主要返回后,将调用exit.如果系统的exit版本没有立即停止执行进程,那么hlt就在那里.在用户模式下,它将导致保护错误,这将导致进程终止.如果进程由于某种原因在环0中运行,它将停止处理器直到下一个中断,这将有希望触发操作系统删除进程.在设计为在环0中运行的进程中,在hlt之后经常存在jmp指令,这将导致hlt反复执行直到进程终止.