从程序的参数反转字符

逆向工程 拆卸 二元分析
2021-06-15 22:01:32

下面的代码来自 IDA。

这是解析函数之前的代码:

movzx   eax, byte ptr [rbp+nineth_char+3]
movsx   eax, al
mov     edi, eax
call    sub_898

这是解析函数的代码:

push    rbp
mov     rbp, rsp
mov     eax, edi
mov     [rbp+var_14], al
movsx   eax, [rbp+var_14]
mov     [rbp+var_1], al
mov     [rbp+var_2], 250
movzx   edx, [rbp+var_1]
movzx   eax, [rbp+var_2]
add     eax, edx
nop
pop     rbp
retn

此函数的参数是二进制文件参数中第 9 个字符的 ascii 值。该值与 [rbp+var_2] 中的值相加,即 250。此函数返回相加的结果。

这是解析函数后的代码:

mov     edx, eax
movzx   eax, [rbp+var_35] ; 101
cmp     dl, al
jz      short loc_F6

结果与 101 值进行比较,当设置 ZF 标志时,处理器将跳转到下一个标签。

等式是:ascii_value_of_char + 250 = 101,但字符的ascii值不能是负数。那么我对这段代码的理解好不好?如果没有,你能告诉我我做错了什么吗?

1个回答

据我了解,它只比较结果的一个字节(相应寄存器的比较aldl部分的大小为8 位)。这让你的方程有点不同:

(ascii_value_of_char + 250) & 0xff = 101

这绝对是可以解决的,在这种情况下,char 的 ascii 值是“k”。例如,您可以在此处查看 rax、eax、dh 和 dl 之间的区别