吾爱中的逆向练习题
运行程序
有两个方式 一个是账号登入
一个是序列号输入
账号输入
方法一 爆破
我们先进行账号输入
这个是最简单的逆向 所以我们可以使用 字符串查找看看
先试用ollydbg打开
右键 ->查找 ->所有参考文本字符串
这里我们能发现有两个报错
我们还不知道是哪一个 我们随便进入一个看看 我们先进入第一个
打上断点 重新执行程序
触发断点 我们开始单步调试看看
这里直接越过了第一个报错 说明这个不是第一个报错的位置
发现成功语句 并且带有跳转
我们可以通过 OllyDbg看到 这个跳转是跳转到 下面错误的位置 所以这个就是核心跳转了
我们修改为nop
保存为新的文件
这里就成功了
方法二 算法
在第一次的调试后我发现一些问题
这个报错是在 字符串输入很短的时候进行报错
所以我们可以直接修改为 jmp
jmp short 0042FA79
这个时候就是无条件跳转 不会发生报错
我们可以继续分析程序
在最后输出 错误和正确的时候 出现了这个
感觉和序列号一样 我们看看是不是这个
查看eax的字符串
复制下来
直接打开程序
发现就是序列号
所以我们开始分析
我们开始逆向看看 先看看三个call 函数
经过测试 发现不是里面的内容 里面是一大堆跳转
所以我们思考是不是之前就已经在程序中计算出来序列号了
我们再重新执行程序 然后输入一个特定的值 我输入 2233
发现在这里存入了 2233
这里存入了 29h
注意这里的代码
imul 得出的结果存入 eax
所以下面
eax的内容变为了 0802
在内存中是 0208存入的
这个代码又把两个 02 08 00 00相加 变为了 0410 00 00
然后我们去看看我们后面的序列号
发现就是 4100
所以这里就是计算序列号
1 先取 2233 的 第一个字节 2
然后和 0x29相乘
为 02 08
然后一倍 04 10
我们就可以编写程序
cName = input("Input Name:\n")
iName = ord(cName[0]) # 获取字符串的第一个字符并将其转换为整数
if iName > 0x21:
iName *= 0x29 # 乘法
iName *= 2 # 自增一倍
print("Serial: CW-{0:04d}-CRACKED".format(iName))
else:
print("input error!")
取得序列号
通过serial来注册
算法
这个有了之前的方法很简单
我们先看看 程序给的字符串是什么
我们去找try again这个字符串
有3 个 我们都设断点 看看停在哪里
开始执行 触发断点
触发了 我们开始看看这个程序的代码
出现了ascii 我们开始设置最上面为eip 然后单步执行程序
发现这个是在比对
因为我没有输入 所以会显示 让我输入值
我们可以看看是不是这个 我们重新打开程序
发现成功了
所以这个就是 serial 固定不变
爆破
我们看懂代码后
这个跳转就和之前一样 我们改为 nop 就实现了爆破
保存后 我们看看功能怎么样
注册是OK的
serial也是ok的
我们看看用合法的方式
看看serial
这个时候 程序就成功了