报名插足了一下2024的游戏安全竞赛,今天预赛收尾色狼集中营,总体来说赛题质地还黑白常高的。
解题附件下载
<!--more-->
匿名 文爱 app略
先器用分析一下,发现加了 VM,动调发现对许多器用有检测,部分更名不错径直绕过,然而 CE 怎样改王人会被检测,是以先上微步基天职析一下举止:
https://s.threatbook.com/report/file/1bc2f607b5e4707a70a32bb78ac72c9b895f00413ba4bd21229f6103757ca19f
珍摄到了有注入举止,一般瓦解过 WriteProcessMemory 这个 API 进行,于是编写 DLL 去hook望望情况。
这一块没什么发达,然而一霎发现这个进度对其它进度有些操作
这不等于 token1 嘛,然而发现底下莫得这个文献,尝试创建这个文献,发现径直就有推行写进去了,用敕令不错打印出来。
于是 token1 就出来了,很神奇。 token1: 757F4749AEBB1891EF5AC2A9B5439CEA。
关于token2,一直尝试作念一些 API 的 hook 想望望它干了啥,这里我作念了 MmCopyMemory 的 hook。
收尾径直莫得调用过。后头还相似的设施 hook 了其它的 API,诸如 KeStackAttachProcess 的,相似莫得调用,于是堕入千里念念,既然它莫得把 token 写到 r3 那大致率在 r0 层。
同期在一次适值中(开了 DbgView 的 verbose),发现 token 径直打印出来了。
那么 token2 就出来了 token2: 8b3f14a24d64f3e697957c252e3a5686
是以 flag 等于 flag{757F4749AEBB1891EF5AC2A9B5439CEA-8b3f14a24d64f3e697957c252e3a5686}
最初望望内核层的输出吧,因为它底本就不错输出,径直调用的 DbgPrintEx 函数,只不外某个 Level 无法平淡被禁受散伙,尝试 hook 一下,望望 Level
执续输出了 call DbgPrintEx(0000000000000000,0000000000000005,FFFFF1001067EB90) Level=5果真不成输出任何推行了,因此尝试hook替换让它不错输出,然而这里 Hook 依然太封闭了,于是我遴荐打下断点之后栈回溯一下望望情况
不错发现重要 call 之前,有对 edx 赋值为 5,那么径直修改这个教唆,把 hook 解掉望望能否输出。
这里我遴荐手动改一下,一共发现了三个位置,特征王人是差未几的,王人把 mov edx,5 改成 mov edx,0。
发现改完之后 token 胜利输出了。
然而这里应该是驱动加载本领分拨的内存写入的 shellcode,淌若能知说念地址,那么能去改掉这些教唆,然而地址是我通过栈回溯找到的,淌若莫得hook掉系统 API,那么我根柢不太可能去取得到shellcode的地址。于是料想它既然是束缚地在打印的,势必创建了一个内核线程,那么我先遍历一下内核线程。
在中间我判断了一下地址是否为 0xFFFF 滥觞来判断是否为内核线程,然后打印出来之后,搜索通过栈回溯得到的 shellcode 的前几位。
色狼集中营
很运道地只可找到一个,屡次实验之后发现它shellcode是不会变的(至少头几个字节),那么就不错匹配特征码去判断 shellcode 的地址。
何况不错手动计算一下 shellcode StartAddress 和 对应要修改的教唆的偏移。
启动地址:0xFFFFBB0EDB013DB0
修改地址1:0xffffbb0edb013e01
修改地址2:0xffffbb0edb013e64
修改地址3:0xffffbb0edb013ed4
差别是 shellcode+0x51+1,shellcode+0xb4+1,shellcode+0x124+1 的位置。(+1是因为要改的操作数在教唆的偏移处)
先编写一个遍历内核线程的法子,然后去特判它的特征码,来细则shellcode位置,临了再写入三个教唆即可。
该文献编译居品为 XSafe2.sys,运转题目之后加载这个驱动不错让 token2 输出。
通过下图不错看到,驱动加载后搜索到了 shellcode 的地址,并通过修改内存让 token胜利输出了,然而我方作念的本领发现是有概率的,有本领可能搜不到这个线程,从截图不错看出反复加载了4次才胜利找到 shellcode,然而注入胜利之后也胜利输出了 token2。
token1 的话不错摄取新建 C:\2024GameSafeRace.token1 文献的边幅让它将 token1 打印出来,究其原因莫得胜利输出出来是因为创建文献的本领莫得让它在文献不存在时创建。
后头发现写文献的进度好像是 TaskMgr,何况 token1 是不错独处运转的,是以不错把编造机的测试花式关了,后头只需要分析这个三环法子即可。
用调试器附加,天然外挂法子检测了调试器,然而通过更名不错绕过,断在创建文献的API上 CreateFileA
栈回溯一下发现创建是失败的(复返-1)。
要让它胜利输出让它创建胜利即可,同期不雅察栈我珍摄到了有个参数3,而参数通过查阅 CreateFileA 的参数阐扬可知
这也就讲解了为什么创建一个文献能够胜利写入,尝试把它修改成 1。
发现胜利复返了,是以标的独特明确了,让它传的第五个参数改成1即可胜利输出到文献中,而刚好珍摄到上头的一条教唆有径直 mov xxx,3 的,把它改成1试试。
文献即使不存在也会创建并输出胜利。
那么这里说一个可行的念念路:相似注入一个 dll 给它,然后去遍历线程找到 shellcode 进口,计算偏移改掉这个教唆,让 token3 胜利输出。
先手动操作一遍:
此时不错发现线程进口是 0000019B070AAB48,要修改的教唆地址为 0000019B070A4D6D
在 StartRoutine - 0x5ddb 的位置上,而且它的地址很显然,惟有在堆上就合适条目,然而为了保障依然取一定长度的特征码去相比。
那么据此写一个针对 Taskmgr 的注入器(二进制文献为 Xinject.exe):
然后证明以上分析收尾写一个改动这个代码的 DLL(二进制文献为 XHack.dll):
运转 hack.exe 之后,运转 Xinject.exe 即可达到如下后果:
注入收尾之后不错看到立地创建了文献。
第二题就完整地终澄莹。
附件阐扬:
其实依然 hook 这个地点,改它的写入文献名即可,这里我又珍摄到
往下顺着看,它把RAX写到了 RBP+0x20 的位置,然而临了又对它写了第五个参数,因此基本不错以为这个教唆是毋庸的,尝试去进度分拨一块内存,在这个地点将 RCX 的值赋值给它即可达成苟且位置的写入。
这个教唆位置在 StartRoutine - 0x5ddb - 0x67 处。
用底下的代码编译出 XHack.dll (运转时需要更名为这个,用第二题的注入器,附件中的文献名为 XHack3.dll)
先分拨一个内存,写入地址,再构造 mov rcx,xxx 教唆,临了替换到指定位置即可。
推行也独特竣工莫得被改动
4,5如上所示,源代码均在本文中提供,在打包的可实行文献中:
统共的附件阐扬:
三天没打满,中间一天抽空去拿了个ACM省赛。
然后第二天又接到调剂复试告知赶路去了。
不外临了好在依然赶着临了完成了赛题 233。
https://www.ctyun.cn/zhishi/p-233867色狼集中营