本文最后更新于6 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
ida打开
看不了伪c代码,只能看汇编了
xor ax, ax
- 这个指令将
ax
寄存器清零。通过与自身进行异或操作(XOR),ax
的值变为 0。
mov al, [si]
- 这条指令将
si
寄存器指向的内存地址中的字节加载到ax
寄存器的低 8 位(即al
)。此时,al
包含[si]
处的字节。
shl al, 1
(重复4次)
- 这四条
shl
(左移)指令分别将al
左移 1 位。左移相当于将al
的值乘以 2。经过四次左移后,相当于将al
的值乘以 16(即左移了 4 位)。
push ax
- 这条指令将
ax
的当前值压入栈中。此时ax
保存的是经过左移操作后的值。
xor ax, ax
- 这条指令再次清空
ax
寄存器,将其值置为 0。
mov al, [si]
- 这条指令重新将
si
指向的内存地址中的字节加载到al
寄存器。
shr al, 1
(重复4次)
- 这四条
shr
(右移)指令分别将al
右移 1 位。右移相当于将al
的值除以 2。经过四次右移后,相当于将al
的值除以 16(即右移了 4 位)。
pop bx
- 这条指令将栈顶的值弹出到
bx
寄存器。栈顶的值是之前被push
的ax
的值。
add ax, bx
- 这条指令将
bx
寄存器的值加到ax
寄存器中,即将从栈中弹出的值与当前的ax
值相加。
xor ax, 17h
- 这条指令将
ax
与 0x17(十六进制的 17)进行异或操作。这样会改变ax
寄存器的值。
add si, 1
- 这条指令将
si
寄存器的值加 1,目的是让si
指向内存中的下一个字节。
cmp al, es:[si-1]
- 这条指令将
al
的值与es:[si-1]
指向的内存地址的值进行比较。es
是附加段寄存器,[si-1]
是si-1
处的内存值。
jz short loc_100DD
- 如果
al
与es:[si-1]
的值相等(即零标志位被设置),则跳转到标签loc_100DD
处。
这是加密后的数据,我们只需要将其与0x17异或,再向左偏移4,储存结果,加上向右偏移4的结果即可
%128确保了我们不会生成超过字符范围的值
aa=[0x91, 0x61, 0x01, 0xC1, 0x41, 0xA0, 0x60, 0x41, 0xD1, 0x21,
0x14, 0xC1, 0x41, 0xE2, 0x50, 0xE1, 0xE2, 0x54, 0x20, 0xC1,
0xE2, 0x60, 0x14, 0x30, 0xD1, 0x51, 0xC0, 0x17]
flag=[]
for i in aa:
tan=i^0x17
flag+=chr((tan>>4)+((tan<<4)%128))
print("".join(flag))