160CM-031
1. 爆破
爆破比较简单,搜索关键字符,找到第一个跳转位置00402EE2 /0F84 A1000000 je cracking.00402F89 ,将je改成jmp;找到第二个跳转位置00402FC1 /0F84 8F000000 je cracking.00403056 ,将该行代码nop掉,就可以了。
2. 算法分析
用VB Decompiler反编译,找到按键响应事件代码如下:
从伪代码来看,基本可以看出是将输入的密码字符串经过两次异或运算后,与VeiajeEjbavwij 进行比较。其中第二次异或运算反汇编识别的不是很准确,需要OD跟踪确认一下函数和参数。
使用vs2015编写验证程序如下:
Module Module1
Sub Main()
Dim key As String
Dim password As String
Dim temp1 As String
Dim temp2 As String
Dim i As Int32
Dim j As Int32
Dim length As Int32
temp1 = ""
temp2 = ""
Console.WriteLine("请输入密码:")
key = Console.ReadLine()
length = Len(key)
For i = 1 To length
temp1 = temp1 & Chr(Asc(CStr(Left(4, 1))) Xor Asc(CStr(Mid(key, i, 1))))
Next
Console.WriteLine("temp1为:" + temp1)
For i = 1 To length
j = i Mod 4
If j = 0 Then j = 4
temp2 = temp2 & Chr(Asc(Mid(temp1, i, 1)) Xor Asc(Mid(2000, j, 1)))
Next
Console.WriteLine("temp2为:" + temp2)
Console.WriteLine("按回车键退出程序!")
Console.ReadLine()
End Sub
End Module
输入字符串abcdef ,可以得到前后两次异或运算的结果字符串如下,与OD跟踪的计算结果一致,说明算法正确。
剩下的就是反向运算,通过已知的字符串VeiajeEjbavwij ,计算得到password。根据异或运算的特点,只需要将已知的字符串VeiajeEjbavwij 做输入量,经过两次异或运算,就能得到正确的password。
将PamelaAnderson 输入程序输入框,验证正确。
3. 总结
这道题相较上一道题,多了一次异或运算过程。由于反编译识别的结果不大准确,因此第二次异或运算的细节需要动态调试跟踪一下来确定。其中比较关键的函数就是rtcMidCharVar ,这个函数的功能是从字符串中取相应字符,实际就是VB中的MID函数,用法MID("字符串","开始的位置","取几个字符")。
汇编调用示例及参数含义如下:
push ecx ;取几个字符
push edx ;开始的位置
push eax ;字符串
push ebx ;结果存放地址
call rtcMidCharVar
|