跳障碍汇编代码

时间:2015-12-05 15:09:45

标签: assembly nasm ida

我必须了解此代码用于跳转出口调用的操作。我只有静态视图,而不是动态视图,因为我无法使用调试器。 这是代码:

; int __cdecl main(int, char **, char **)
main proc near

var_14= dword ptr -14h
var_10= dword ptr -10h
handle= dword ptr -0Ch
fd= dword ptr -8
var_4= dword ptr -4
arg_4= dword ptr  0Ch

push    ebp
mov     ebp, esp
sub     esp, 24h
cmp     al, al
jz      short near ptr loc_8048DEC+3

xor     esp, esp

loc_8048DEC:
mov     dword ptr [ecx+42h], 2087D83h
jz      short loc_8048E25

mov     dword ptr [esp], 0Bh ; status
call    _exit

1 个答案:

答案 0 :(得分:2)

使用重叠操作码对反汇编进行模糊处理。

首先,无论movw %sp, %bp subw $6, %sp movw $0xd000, -2(%bp) movw $0, -4(%bp) movw $1, -6(%bp) 的内容如何,​​都保证指令cmp al, al设置零标志。因此,将采用以下行的al条件跳转。

jz将三个字节跳转到jz指令。该指令的十六进制表示为mov dword ptr [ecx+42h], 2087D83h 1 。所以我们实际上开始执行c7 41 42 83 7d 08 02

83反汇编为83 7d 08 02。请注意,因为它与IDA显示的误导性cmp dword ptr [ebp+8], 2指令在同一指令边界上结束,所以要执行的下一条指令与IDA为您提供的反汇编排列在一起。

那么,在下一行mov中,如果设置了零标志,我们只会跳转到jz short loc_8048E25;也就是说,如果loc_8048E25(这是[ebp+8]的第一个参数,即main)等于argc。否则,我们会执行接下来的两条指令,相当于2

要在IDA中修复反汇编......

您可以通过点击exit(11)行并按mov键来取消组合mov指令。您也可以使用u键在loc_8048DEC+3处开始重新组合。在执行此操作之前,您应该保存数据库。

<子> 许多助记符可以由多个字节序列表示。例如,这个特定指令也可能表示为c,但A)编译器倾向于生成最短形式的指令,而B)生成的重叠指令不会有意义&#34; 34;并且可能会发生段错误。 IDA可以在Hex视图中显示每条指令的实际字节表示,或者如果您正确设置c7 81 42 00 00 00 83 7d 08 02