逆向断章取义
MIRACL大数库了解一下
在OD中调试下断的时候,看到了这个字符串
有个反调试原理:查看当前进程的父进程是否为explorer.exe
双击运行和cmd运行的程序的父进程都是explorer.exe,在OD下调试的程序的父进程是OD,这可以作为一个反动态调试的原理根据,奇怪的是对OD没啥用,还是可以正常下断正常调试(除了输出的提示字符串不同,不影响正常功能)
https://bbs.pediy.com/thread-228792.htm
这里有个IDA-python脚本可以学习(用来patch的)
https://blog.csdn.net/kevin66654/article/details/80794088
根据对抗反汇编的思路,在main中修改IDA的反汇编(Data和Code的识别,把干扰分析的patch掉)
绕过了这些,可以看到之后开始有对于输入的判断了
flag长度为0x17 = 23
402220函数:把输入的字符转换为对应的hex形式,如 ‘a’ = 0x61,即变成61
看到数据0x3e9 = 1001
分析402580函数:
中间的jmp都nop掉,可以发现功能为:
一个简单的XOR,可以猜想是对数据进行处理
然后看到402630函数,做同样的nop操作之后,发现:
根据0x3e9,得知40D1E0函数为初始化函数
分析逻辑,v2,v4,v5在函数40C110的计算之下会变成c3,根据某种转化会变成v75,然后进行比对
根据算法分析猜想RSA,从初始化过程中提取数据
第二部分check在402D60函数中:IDA解析仍然出错
在IDA里使用Data和Code的转换,可以明显看出逻辑,把中间的全部nop掉即可
在函数中翻到了如下的数据:
搜索一下为AES加密中的Sbox,初步判断为AES加密
可见,key与我们输入flag的前三个字节有关
Message为明文pediy,也就是说,pediy经过某个密钥AES加密之后,等于一个值
因为就三个字符,第一想法是爆破:62 * 62 * 62 = 238328,也是可行方法
在IDA中发现了AESCheck之前,对这三个字符进行了判断:必须都是数字
所以爆破总数为1000!
先单步调试确认一下数据
对于AES的加密部分,密钥为前三位数字相关,明文pediy
爆破的几种姿势:
https://bbs.pediy.com/thread-228754.htm
运行批处理,因为正确输入和错误输入的返回结果不同,用来暴力,记录一下代码:
set a=100
echo %a%iamahandsomeguyhaha1 | CrackMe.exe > a.txt
:retry
set /a a=a+1
echo %a%iamahandsomeguyhaha1 | CrackMe.exe > b.txt
fc a.txt b.txt
if %ERRORLEVEL%==0 goto retry
还有这样的py姿势:
https://bbs.pediy.com/thread-228772.htm
# -*- coding: ascii -*-
import subprocess
sn3="iamahandsomeguyhaha1"
for i in range(100,999):
p = subprocess.Popen("CrackMe.exe", stdin = subprocess.PIPE,\
stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = True)
sn=str(i)+sn3+'\n'
outs,errs=p.communicate(bytes(sn.encode("ascii")))
if(b"success" in outs):
print(sn)
break