逆向断章取义

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