-
-
[分享]CTF2017 第11题 CrackMe 设计思路和破解思路
-
发表于:
2017-6-23 12:13
4948
-
[分享]CTF2017 第11题 CrackMe 设计思路和破解思路
1.为程序写了一个简单的壳,对程序进行简单的异或加密。若对程序进行dump,会丢失藏在文件中但没有读入内存的DES解密函数,使序列号无法正常解密
2.使用自己实现的LoadLibrary将kernel32加载到内存中,并使用自己实现的GetProcAddress通过已加密的函数名获取函数地址,隐藏api调用
3.程序入口处判断了是否处于调试状态,包括检查PEB的BeingDebugged成员、堆标志和父进程名是否为explore.exe或cmd.e xe:
1)如果不为调试状态,则以调试方式打开程序本身,创建子进程
2)如果处于调试状态,则显示CrackMe对话框
4.通过SetUnhandledExceptionFilter设置了异常筛选器
5.当用户点击确定按钮时,在父进程名和本进程名一致时会触发除0异常。如果本进程是通过父进程以调试模式打开,则该异常会被父进程捕获;否则,会被异常筛选器给捕获(正常情况不会来这里)
6.程序本身没有正常调用验证序列号的流程。当父进程捕捉到除0异常之后(程序第一次点击确认按钮时),会对错误的验证序列号的函数进行hook,从而跳转到正确的流程。
7.验证序列号流程:
1)程序中提供前96字节的DES解密算法明文(记为fuc1)。验证前会将pe文件中已的DES解密算法密文(记为fuc2)读入内存中
2)验证码的前10个十六进制字符组成4字节和1字节的两个秘钥,这两个秘钥对fuc2进行简单移位异或操作解密并与fuc1的前96字节比较,验证成功则继续
3)验证码的后32字符组成16字节密文,通过程序中提供的秘钥调用fuc1对密文进行解密,验证解密出的明文与程序中的明文进行比较,字符串相同则为提示成功(对此处由于我的疏忽没考虑到字符串的’/0’结尾后还能填写数据造成了程序无数解深表遗憾)
定位到壳结束代码jmp eax跳转到OEP的代码位置,跳转后可以对程序进行dump。
在WinMain中通过修改全局的调试状态标志位使得程序能够在调试状态下创建子进程(默认只能通过explore.exe和cmd.exe打开的进程才会创建子进程)
在点击按钮的时候子进程会触发除0异常
对父进程的ZwWriteVirtualMemory下断点(对WriteProcessMemory下断点无效,程序会走自己加载的kernel32)可以看到对子进程写了两次内存
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)