比较晚的复现 一直挂念着当时没做出来的MFC逆向
还有RC4的源码 和 介绍
当时差一点点做出300的那题 就差最后的解方程 没时间了 很气
这里就写两题逆向的吧
0x00 Symmetric Cipher – 250
当时完全摸不着头脑的MFC逆向题 真鸡儿难!
主要是完全找不到关键的check函数
基于MFC的教程1
基于MFC的教程2
基于MFC的教程3
这里我用的是第三篇里的方法 搜索控件ID(也可以用xspy)
看到输入框的ID是比较特殊的1003
用ida搜索立即数的功能 alt+I
我们要找到.rdata中指令为数据,并且数值是1003(十六进制为0x3EB)的地址,注意这边只会显示一个字节db,所以是0x3EB的EB,双击跟进是不是一下子就到了消息映射表了?只要把当前的消息映射表用上一篇的方法转换下,很快就能定位到对应的按钮处理函数了
不用转换也行 就是往下翻一翻 点开函数就能看到关键函数了
第一个是判断flag长度是否到了30
1 | int __thiscall sub_4024C0(char *this) |
第二个是关键的check函数
进去是一个rc4加密
RC4详解(也可参考课堂5)
RC4由伪随机数生成器和异或运算组成。RC4的密钥长度可变,范围是[1,255]。RC4一个字节一个字节地加解密。给定一个密钥,伪随机数生成器接受密钥并产生一个S盒。S盒用来加密数据,而且在加密过程中S盒会变化。
由于异或运算的对合性,RC4加密解密使用同一套算法。
包括初始化算法(KSA)和伪随机子密码生成算法(PRGA)
前两个循环是密钥的加密形成
1 | char __thiscall sub_4025F0(void *this) |
后一个循环是对明文的加密
1 | v7 = strlen(v1); |
最后这段代码就是一个比较
1 | v13 = &v20; |
这里专门写一下 RC4 的python的代码
1 | class RC4: |
输出
1 | helloworld |
改一下输入 key是硬编码
1 | key = 'noitaicossA_llabteksaB_lanoitaN'[::-1] |
rr5hgVxS3rJtT/G+KN1gRYBlc3qS0rSXZzUNadI=
cumtctf{Mfc_1s_VerY_difflcUIt}
领航杯的
1 | # -*- coding: utf-8 -*- |
0x01 Windows Cracker
这题差在最后的解方程 没找到合适的方法解方程 导致功亏一篑
是一个Windows下的GUI程序,程序本身很简单,就是弹出一个对话框,根据输入计算flag
程序的量比较小 可以靠翻翻到主要的check函数
在这个程序中,窗口过程首先接受WM_CREATE消息,进行窗口控件的创建,创建了一个文本框和一个确定按钮。对于确定按钮,定义了HMENU参数是250,一句话,也就是说在点击按钮后,产生wParam消息的低位是250,直接进入sub_401350()函数中进行判断
这里调用GetWindowTextA()API来判断输入长度,当输入长度不是41的时候,直接通过SendMessageW()向窗口过程发送消息,且wParam参数是1111,上一级函数里,此时会直接调用MessageBoxW(hWnd, L”flag错误”, L”FAIL”, 0x40u)即弹框,flag错误。所以我们可以确定flag长度就是41。接下来进入核心的Check函数验证算法
1 | #coding:utf-8 |
cumtctf{Ai_CaN_he1P_y0U_SoIve_eqUatl0n5!}