【Reversing】第一题:2h
emmm题目就是这样,一道求密码的题目
字串查找也好,API查找也好先在 Incorrect Password 处打断点,然后从该处找到算法call(要先确定一个CALL不是算法CALL之后再RET,开始在上一层判断是否单击了按钮的CALL里循环了好久).
单步向下执行,前面好几句都是在初始化桟里的内容
这一步OD已经告诉是对GetDlgItemTextA的调用,即获取文本框内的内容,那么之后肯定就是对输入的密码的正误判断。
紧跟的这一条指令,通过数据窗口跟随esp可以发现esp+0x5里的内容是输入的密码的第二个数,即判断第二个数是否为 a (0x61)。
之后是一条jnz,如果不等就跳转到弹出incorrect对话框,则可以判断密码的第二个数是 a 。
屏蔽掉这个jmp,之后几步都在为一个call传递参数,传递了数字 2 ,字符串“5y”和第三个输入字符的地址,大致可以判断是要判断从第三个位置开始的两个字符是否是"5y".
然后进入这个CALL验证,开始几步保留现场形成新的桟帧。假巴意思判断一下穿进来的参数有没有问题。
【jecxz:如果ecx为0则跳转】;【倒数第三步ecx = 2】
接下来又涉及到一个高级操作。作用是计算字符串长度【其实感觉没用啊】。
【scas: 检索字符串,每次ecx - 1】
做了两次比较比较"5y"和再次确认是y。该CALL结束。
如果返回值是0,继续执行,否则弹窗!
判断第四位和‘R‘是否相同,实际上他拷贝了“R3versing”,大胆猜测接下来是对R3versing的比较。
循环两个两个的比较,直到遇到00。
假巴意思判断一下eax。判断是否进行过比较。
最后再判断一下第一位是否是"E".
之后就是弹窗“congratulation!!”.
flag:"Ea5yR3versing"。完