d3ctf 2023

# 好久没写 blog 了 QAQ,受到某人启发觉得有空还是写写,多少动动笔吧。本来是打算先写安卓学习的那篇,想着找个题复现吧,回来看看 d3 那个写不明白的 android,结果一看 d3 好几个题读作 solved,写作看一眼毫无印象,遂决定回来重新做一次

# d3hell_attachment

image-20230711190621273

首先这里的 d3runtime.dll 就够可疑的了,调起来就有点印象。先在 main 开头断下来,果不其然 modules 里面的 d3runtime.dll 里面的东西很可疑

image-20230711191017764

之前自己弄过一点 dll 加载相关的出题(后面有空写个 blog 记录一下,希望不鸽,虽然已经鸽了半年)这个位置直接调有时候窗口不会自己跳转过来,这里函数不多,直接往每个函数开头下断点

main 里面的 sleep 常规 nop 掉,下面的逻辑看着是在骗人,真正的逻辑在 dll 里

胆大的直接 F9,出锅了,调了调发现卡在 sub_40216A,重来

压根没进 main,tls_callback 就把 dll 起起来了(第一遍动态的时候在 dll 下了断点,第二遍就直接发现了)

直接进了 d3runtime__61FC1628 看不出来啥用,有点像花但不能 nop 的

image-20230711192346716

感觉是故意的… 编译器会这么优化么… 不能删这里,逻辑是中间的 mov 和 add 走两次,下面有个一样的操作

谁教的…

不能 F5,单步往下

而后 d3runtime__61FC1578 函数,TEA 加密,但是不知道啥用,接着调

image-20230711192920527

这里上了反调,直接过掉,但是后面的代码很奇怪,明显反编译有问题,重调

注意到一个很奇怪的事情,这里:

image-20230711194724759

合理的话按照上面相同的写法,应该是 E8 00 00 00 00 ,但是这里少了一个 00,一开始以为可以不需要,但是想想不对。这里怎么想都应该是 call $5 的操作,然后后面可以还原出上面的逻辑

哦,动动脑子,这里换 32-bit 了,天堂之门,对应题目 hell

这里确实萌新没接触过天堂之门的,没从 tlsDllMainCRTStartup 里看出什么端倪,但是总归这里是 32bit,那 dump 下来放进 ida 里看看,呜哇,修了半个小时修不明白

那也可以硬调吧,不妨碍,既然他能运行那姑且也可以调

image-20230711200137667

调 dll 的确实… 不知道谁也出过类似的恶心题目

但是主逻辑有了的,下面 isdebuggerpresent 给他拿掉,这里主要是 V0 没有识别出来,跳转的时候没有找到 jmp 的位置,否则不会有那么多逃逸变量…

勉强可以辨认这里修改的表

回到 main 里,实际操作也就这里面:

image-20230711200826897

byte_405060 刚才在 dll 已经走过了,差这个 flag 表,应当在这里走走:

image-20230711201100046

再往前推么发现跟 v12 有关,于是牵扯到了 sub_40216A ,这里确实确实看不懂了,即使出题人好心没去结构体的符号表…

先说结论,这里是大整数分解。其次,看的别人的 wp 知道的

结论是这里把换后的表带入大整数分解,得到的两段拼接起来是 flag…

# 合着练了一下动调… 实话说目前算是做不出来这个题的…
# 嗯,天堂之门有空来写一个试试…[参考]([原创] 天堂之门 (Heaven’s Gate) C 语言实现 - 软件逆向 - 看雪 - 安全社区 | 安全招聘 | kanxue.com)
# 结论,有经验的话就不算难题,但是初见还挺可怕的

#