一开始不知道怎么调试,拿到代码很乱,后面慢慢的调,终于找到关键代码
关键就是那个比较,其中eax的计算根据输入计算得到的,exc在内存中提出来的
然后我们来看地址0xeb5018是什么字符,在00EB1222那里右键数据窗口中跟随==>地址常量
可以看到要比较的十六进制数,然后我们再来看具体的算法操第一步的操作:
可以知道大概就是(ecx*2-6)^ecx 而ecx放的就是输入的字符串的一个字节
第二步:
这里就是之前的数-2edx,而edx是从0-15的,最后理解了大概的逻辑,写脚本:
import string
dic = string.printable
dict=[0xB9,0x3A,0xA9,0xD8,0x15,0x8A,0xE7,0x42,0x69,0x90,0xCA,0xA3,0x4D,0xD8,0xD9,0xC9]
flag=""
for i in range(16):
for j in dic:
if( ( ( (ord(j)*2-6) ^ ord(j) ) - 2*i )==dict[i]):
flag+=j
break
print flag
网友评论