Easy CrackMe
0x01 逆算法
IDA, 找到main_0
,F5
flag存到了v7中,之后有个判断,
if (v10 < 0 || v10 > 10)
条件成立则打印Failed
-> flag的长度在1-10之间,
但是具体的位数不定,继续往下看
发现是以位数作为入口点,继续往下看
发现关键点,v8 != 9
则打印Failed
-> v8 == 9
则打印Success!
, 该判断的标签为LABEL_21
接下来用排除法,把位数排除了
case 9:
case 9: break;
这里直接跳出switch,然后往下执行,来到
假设第一个字符为z
, 那么这里条件不满足
此时v9 = 1, v8 = 1
来到第二个循环,假设第二个字符还是为z
,那么goto LABEL_48
此时v9 = 2, v8 = 0
假设第三个字符为h
, goto LABEL_9
此时v9 = 3
, v8 = 2
假设第四个字符为w
, goto LABEL_44
此时v9 = 4, v8 = 4
假设第五个字符为a
, goto LABEL_13
此时v9 = 5, v8 = 7
假设第六个字符为x
, goto LABEL_40
此时v9 = 6, v8 = 8
假设第七个字符为y
, goto LABEL_17
此时v9 = 7, v8 = 9
假设第八个字符为!
, goto LABEL_36
此时v9 = 8, v8 = 10
来到最后一个字符,所以需要跳出循环,那么此时最后一个字符,只能是<
可以发现刚好v8 - 1 = 9
, 符合LABEL_21
的要求
综上,可以得到flag为zzhwaxy!<
0x02 爆破
拖进OD,搜索字符串
跟进来到该位置
下F2断点,运行
单步往下走,到0040104C会卡住,这里需要输入键值
随便输入点东西就可以了
之后有两个cmp
,这两个就是判断输入长度的,那么00401058
就是strlen
函数,该函数计算完的值放在eax
寄存器中,之后将该值传给局部变量[local.1]
看到jmp
跳转的地址00401450
看到第一个JCC
指令,有机会跳到jmp
,所以这里将其NOP
掉即可,
第二个JCC
指令会绕过跳向失败的jmp
,将第二个JCC
修改为jmp
无条件跳转
修改后:
往下单步,这个ja
跳的地址也是00401450
,所以这里将其NOP
掉
之后的JMP
指令跳到了, 发现Success
字符串,单步,发现有个JNZ
,这里也可以直接NOP
单步之后输出Success
,那么破解就成功了
之后dump即可。