实验吧-证明自己吧(超详细)

Crackme拖到IDA里查看


实验吧-证明自己吧(超详细)_第1张图片


可以看到,程序通过eax跳转,而eax的值很有可能是上面那个call    sub_401060决定的。

 

进入到sub_401060查看,可以看到最后的跳转代码有两个,一个是将eax清零,是错误跳转,一个是将eax赋值1,是正确跳转

实验吧-证明自己吧(超详细)_第2张图片


直接F5查看代码,关键代码如下:其中a1是传入函数的一个指针,指向我们输入的字符串,

这段代码大致就是将传入的字符串与0x20进行异或,然后将程序存储的一串字符进行减5,然后将两个字符串比较,如果相等就返回1,既成功,否则失败

实验吧-证明自己吧(超详细)_第3张图片


到这里已经很清楚了,然后用OD来找程序存储的另外一字符串就可以了,首先用ida查看那段代码的地址,在option中设置,

 

 实验吧-证明自己吧(超详细)_第4张图片

 实验吧-证明自己吧(超详细)_第5张图片



这里解释一下ida里的一串代码,repne scasb在代码中出现了很多次,作用就是计算字符串长度,edi中存放要计算的字符串,ecx中存放算好的字符串长度,eax中存放要查找的字符,如果是0的话就是计算字符串长度

 
lea     edi, [esp+1Ch+var_10]   
or      ecx, 0FFFFFFFFh         设置循环次数-1 
xor     eax, eax                设置搜索内容0 
xor     edx, edx
repne scasb                     一直重复搜索到EDI字符串末尾的0
not     ecx                    得到搜索次数,也就是字符串的完整长度
dec     ecx                    -1得到字符串不包含末尾0的长度 


转到OD,转到上述地址,然后F2下断点,F9运行到刚下的断点处,运行程序,发现程序固定的字符串长度为14,

 

一路运行,直到到比较两个字符串的位置,

实验吧-证明自己吧(超详细)_第6张图片



找到固定字符串所在位置,然后读取出14个字符,分别为0x63,0x52,0x14,0x43,0x4B,0x69,0x53,0x73,0x4F,0x65,0x14,0x53,0x59,0x01

 

最后一步,用python解出flag,代码如下:

a=[0x63,0x52,0x14,0x43,0x4B,0x69,0x53,0x73,0x4F,0x65,0x14,0x53,0x59,0x01]

for i in a:

    print(chr(i^0x20),end='')




你可能感兴趣的:(逆向)