170916 逆向-WHCTF(BabyRe/CrackMe)

这篇博客介绍了作者在WHCTF比赛中遇到的两个逆向分析挑战,包括一个C++编写的CRACKME程序和一个名为BABYRE的程序。在CRACKME中,通过IDA分析和OD调试,发现了字符串加密和特定位置字符的验证机制,最终解密得到了flag。而在BABYRE中,程序对关键函数进行了动态加密,通过IDA远程调试和编写IDC脚本解密函数,成功反编译并找出了解密方法,再次获得flag。
摘要由CSDN通过智能技术生成

1625-5 王子昂 总结《2017年9月16日》 【连续第349天总结】
A. XCTF(武汉站)-Reverse
B.

CRACKME

无壳,C++
打开是一个简单的输入框和注册按钮
点击注册按钮会弹框“哎,注册码错了,你得换个新的哟!”

IDA没有main函数,看起来是MFC写的
查找字符串、断GetDlgText等API都没有结果
说明字符串都被加密过了

IDA逐个函数查找,发现有两个函数调用了MessageBoxA
查看交叉引用,发现这两个函数的call都来自于同一个函数,并且还是分支关系
这里写图片描述

回到汇编状态找到sub_401720和sub_4016e0的地址,在OD中下断,再点击注册按钮果然被401720断下来了

说明这里就是关键跳,再回到sub_401720里看看:

int __thiscall sub_401720(CWnd *this)
{
  CWnd *v1; // ebx@1
  char v3; // [sp+Ch] [bp-24h]@1

  v1 = this;
  qmemcpy(&v3, &unk_403290, 0x22u);//字符串拷贝
  sub_4016A0(30, &v3);//处理
  return CWnd::MessageBoxA(v1, &v3, 0, 0);//弹窗
}

两个函数结构类似,都是调用sub_4016A0对v3进行处理,拷贝的字符串源当然不同
sub_4016A0对字符串进行了异或解密,分别是20和30

在OD里对sub_4015E0的判断处下断,爆破之
弹窗“看到我的注册码了么,那就是flag哦”

…………果然没这么简单哦
那么关键问题就在于if里调用的函数了
因为是指针调用,所以只能在OD里看了

004015E6   .  E8 9F030000   call <jmp.&MFC42.#6334>                  ;  get注册码
004015EB   .  8B8E 94020000 mov ecx,dword ptr ds:[esi+0x294]
004015F1   .  8D86 94020000 lea eax,dword ptr ds:[esi+0x294]
004015F7   .  8379 F8 21    cmp dword ptr ds:[ecx-0x8],0x21          ;  长度=0x21
004015FB   .  75 22         jnz short 0dc17c69.0040161F              ;  关键跳1
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值