BUUCTF——CrackMe 反调试操作

发布时间:2023年12月20日

CrackMe Wp

这题主要是反调试

而且不是不让你调试,而是加入了很多干扰项,很磨人

下面列举出这道题的反调试操作

上述操作主要集中在 sub_401830 函数中

本题的反调试
第一处

在这里插入图片描述

由这张图可以知道

*((_DWORD *)NtCurrentPeb()->ProcessHeap + 3)//代表HEAP结构体的第0xc偏移的成员,即Flags

而 第三个flags成员和第四个ForceFlags成员被用作反调试 正常情况下flags的值为2 ForceFlags的值为0

第二处

这是时钟检测进行反调试,但是这里应该没有用作反调试,但是既然出现了,就提一下。以下是原理:

rdtsc指令将时间标签计数器读入 EDX:EAX。

img

Windows系列操作系统的时间间隔10 - 20 毫秒,软件正常运行时的速度比我们分析代码时快得多,所以可以比较上下两句代码的时间戳,来判断程序是否被调试。

img

第三处

PEB 有一个名为NtGlobalFlag(32位系统下偏移量0x68)的字段,程序可以挑战该字段以确定它们是否正在被调试。通常,当进程未被调试时,NtGlobalFlag字段包含值0x0。调试进程时,该字段通常包含值0x70

第四处

BeingDebugged成员是一个标志(Flag),用来标识进程是否处于被调试状态。 进程处于调试状态时,PEB.BeingDebugged成员(+0x2)的值被设为1TRUE);进程在非调试状态下运行时,值被设置为0(FALSE)

第五处

若处于调试状态,则GetStartupInfo得到的StartupInfo里面的参数都会被置为0,处于调试状态的话就会进入干扰项

过程

我的做法是,全部nop掉即可

具体过程不写了,参考这个师傅写的

buuctf-crackMe题解及感悟_ctf crackme-CSDN博客

我这里简单描述自己的理解

这题进了 sub_401830 函数中,就会对密码进行加密操作,最后去对比

这个函数里面逆推,需要满足全部条件(里面也有反调试),得到v16为“dbappsec”

现在v16知道了,我们也可以知道byte_416050里面用到的key,可以通过调试知道是 0x2a,0xd7,0x92,0xe9,0x53,0xe2,0xc4,0xcd ,而且因为给了用户名welcomebeijing,所以byte_416050里面用到的固定是这几个数。

可以看到byte_416050最终给了ecx,所以我们只需要跟踪ecx即可

现在知道v16,byte_416050里用到的key,我们再异或以下就可以得到v15

在这里插入图片描述

借用别人的脚本,很简单

import hashlib
?
box = [0x2a, 0xd7, 0x92, 0xe9, 0x53, 0xe2, 0xc4, 0xcd]
s = "dbappsec"
?
secret = []
?
for i in range(len(s)):
 ? ?secret.append(hex(ord(s[i])^box[i]).replace("0x",''))
flag = ''.join(secret)
md = hashlib.md5()
md.update(flag.encode('utf-8'))
print ("flag{"+md.hexdigest()+"}")

flag{d2be2981b84f2a905669995873d6a36c}

文章来源:https://blog.csdn.net/fzucaicai/article/details/135114732
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。