d3ctf 2023
# 好久没写 blog 了 QAQ,受到某人启发觉得有空还是写写,多少动动笔吧。本来是打算先写安卓学习的那篇,想着找个题复现吧,回来看看 d3 那个写不明白的 android,结果一看 d3 好几个题读作 solved,写作看一眼毫无印象,遂决定回来重新做一次
# d3hell_attachment
首先这里的 d3runtime.dll 就够可疑的了,调起来就有点印象。先在 main 开头断下来,果不其然 modules 里面的 d3runtime.dll 里面的东西很可疑
之前自己弄过一点 dll 加载相关的出题(后面有空写个 blog 记录一下,希望不鸽,虽然已经鸽了半年)这个位置直接调有时候窗口不会自己跳转过来,这里函数不多,直接往每个函数开头下断点
main 里面的 sleep 常规 nop 掉,下面的逻辑看着是在骗人,真正的逻辑在 dll 里
胆大的直接 F9,出锅了,调了调发现卡在 sub_40216A,重来
压根没进 main,tls_callback 就把 dll 起起来了(第一遍动态的时候在 dll 下了断点,第二遍就直接发现了)
直接进了 d3runtime__61FC1628
看不出来啥用,有点像花但不能 nop 的
感觉是故意的… 编译器会这么优化么… 不能删这里,逻辑是中间的 mov 和 add 走两次,下面有个一样的操作
谁教的…
不能 F5,单步往下
而后 d3runtime__61FC1578
函数,TEA 加密,但是不知道啥用,接着调
这里上了反调,直接过掉,但是后面的代码很奇怪,明显反编译有问题,重调
注意到一个很奇怪的事情,这里:
合理的话按照上面相同的写法,应该是 E8 00 00 00 00
,但是这里少了一个 00,一开始以为可以不需要,但是想想不对。这里怎么想都应该是 call $5
的操作,然后后面可以还原出上面的逻辑
哦,动动脑子,这里换 32-bit 了,天堂之门,对应题目 hell
这里确实萌新没接触过天堂之门的,没从 tls
和 DllMainCRTStartup
里看出什么端倪,但是总归这里是 32bit,那 dump 下来放进 ida 里看看,呜哇,修了半个小时修不明白
那也可以硬调吧,不妨碍,既然他能运行那姑且也可以调
调 dll 的确实… 不知道谁也出过类似的恶心题目
但是主逻辑有了的,下面 isdebuggerpresent
给他拿掉,这里主要是 V0 没有识别出来,跳转的时候没有找到 jmp 的位置,否则不会有那么多逃逸变量…
勉强可以辨认这里修改的表
回到 main 里,实际操作也就这里面:
byte_405060
刚才在 dll 已经走过了,差这个 flag 表,应当在这里走走:
再往前推么发现跟 v12 有关,于是牵扯到了 sub_40216A
,这里确实确实看不懂了,即使出题人好心没去结构体的符号表…
先说结论,这里是大整数分解。其次,看的别人的 wp 知道的
结论是这里把换后的表带入大整数分解,得到的两段拼接起来是 flag…