当我注意到一些奇怪的东西时,我正在逆转 OSX VM 上的一些恶意软件。在单步执行指令时,int 0x80
跳过a 之后的指令即会在我不单步执行的情况下执行。
例子:
int 0x80
inc eax ; <--- this gets skipped
inc ecx ; <--- stepping resumes here
为什么会发生这种情况?你有没有遇到过类似的事情?
当我注意到一些奇怪的东西时,我正在逆转 OSX VM 上的一些恶意软件。在单步执行指令时,int 0x80
跳过a 之后的指令即会在我不单步执行的情况下执行。
例子:
int 0x80
inc eax ; <--- this gets skipped
inc ecx ; <--- stepping resumes here
为什么会发生这种情况?你有没有遇到过类似的事情?
单步执行代码时,T
设置该标志以便 CPU 在指令执行完成后中断。当中断发生时,T
标志的状态被放置在堆栈中,并iret
在处理程序执行指令时使用。然而,由于与堆栈初始化相关的遗留问题,该iret
指令是导致T
标志触发中的单指令延迟的少数指令之一。
所以跳过的指令正在执行,但你不能进入它(但如果你在那个位置设置一个断点并运行到那个点,那么你会得到一个中断)。