由WKCTF引发的项目——ReDbg

moshui Lv2

项目地址

ReDbg on Github

WKCTF的痛

当时我正在做WKCTF,其中quite_easy这道题,我简单的分析了一下,发现其TlsCallback_0_0函数中对调试器进行了检测同时strcmp下了hook
下图是我修了花指令之后的代码

调试器检测:
image.png
HOOK:
image.png

这题其实加密并不难,他是用了STL,当时脑抽并没有想到用BinDiff的方法来做

部分加密代码:
image.png

其中不难发现,这个函数其实是单字节加密的,也就是可以单字节爆破

动机

我当时就想用frida来搞,但是我不太会,越写血压越高,所以我就在想,搞个这种轻量化的、支持编程的调试器。

过程

我当时本来想图方便用python来写,结果聪明反被聪明误,python这边反而资料较少,我只找到了GitHub上有一个书配套的代码,不过由于年代问题,那个有很多问题。

Python写这种贴近底层的确实感觉不太好,我当时写的时候,一边查微软文档,一边开着C++比对,一边开ApiMonitor来看调用情况。不过最后写出来了,不过感觉稳定性一般。

为什么会选择用Python写呢,是因为前一阵子小学期一直在拿Python写东西,同时还因为前一段时间改项目上的东西也都是Python的,所以一直坐轮椅一直爽嘛。

在难受过后,我觉得还得是C++,于是我就用C++又写了一个,果然C++就是妙,又快又稳。不过这有一段时间没写C++感觉手感一般了,这也算是回回手吧。

所以提供了Python和C++两种接口

Python这边应该是暂时只能调试32位程序(必须使用64位Python)
C++ 32位 64位都可

结果

我使用如下代码来求解flag,并在1分钟内得到了答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include "debugger.hpp"
#include <chrono>
#include <iostream>

static std::vector<char> boom(std::string&& input) {
std::vector<char> retv{};
bool flag = false;
auto p = ReDbg::Process("quite_easy.exe");
auto dbg = ReDbg::Dbg("quite_easy.exe");
dbg.AddCallback(dbg.GetModuleAddr("quite_easy.exe") + 0xA7C2, [&](CONTEXT c)->void {
retv = dbg.ReadArray<char>(c.Rax, 32);
flag = true;
});
p.WriteLine(input.c_str());
while (!flag) {
Sleep(1);
}
return retv;
}

int main() {

char temp_f[] = { 0x66, 0x6C, 0x61, 0x67, 0x7B, 0x65, 0x64, 0x31, 0x64, 0x36, 0x36, 0x35, 0x65, 0x36, 0x35, 0x31, 0x36, 0x61, 0x33, 0x37, 0x61, 0x62, 0x30, 0x39, 0x66, 0x30, 0x62, 0x37, 0x61, 0x34, 0x30, 0x7D,0x00 };
char enc_data[] = { 0x80, 0xD3, 0x6F, 0xFF, 0x15, 0x03, 0x98, 0x8C, 0xB4, 0x5B, 0x96, 0xC0, 0x59, 0xAC, 0x18, 0xDF, 0x2D, 0xCE, 0x3F, 0xFB, 0xC4, 0xED, 0xD8, 0xD2, 0xA8, 0x2D, 0xF8, 0x23, 0x9F, 0x22, 0x25, 0xCE };
std::string table = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789{}";

std::string flag;
auto start = std::chrono::steady_clock::now();
for (int i = 0; i < 32; ++i) {
for (char j : table) {
temp_f[i] = j;
std::vector<char> enc = boom(temp_f);
if (enc[i] == enc_data[i]) {
flag += temp_f[i];
printf("%c", temp_f[i]);
break;
}
}
}
printf("\n");
auto end = std::chrono::steady_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count() << std::endl;
return 0;
}
//WKCTF{08898c40064d1fc4836db94fe}
//46610120100 这里单位是ns
  • 标题: 由WKCTF引发的项目——ReDbg
  • 作者: moshui
  • 创建于 : 2024-07-25 19:08:36
  • 更新于 : 2024-07-26 00:38:33
  • 链接: https://www.moshui.eu.org/2024/07/25/ReDbg/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
此页目录
由WKCTF引发的项目——ReDbg