HGAME 2023 week3 & week4 writeup
patchme
main
函数里有个 gets
,同时翻了翻发现有一段代码,里面有个 mprotect
下面是对一个大数据段的异或操作,显然是个 SMC,一个比较 pwn 的方法是利用 get
的漏洞改汇编然后跑出 flag,也可以直接逆。
由于只是一个简单异或,考虑用 idapython 直接实现 smc 的解密
1 | from idc_bc695 import * |
解密完的数据 analyze 以后得到关键代码
1 |
|
运行得到 hgame{You_4re_a_p@tch_master_0r_reverse_ma5ter}
kmusic
把 dll 文件扔进 exeinfo 里面发现是 .net 文件,用 dnspy64 打开,定位到 main
函数。
1 | private static void Main() |
发现是对一段 data
进行异或,但是数据在哪里不知道,用附加进程进行动调 (然后发现是个小黑子程序)
调试到 for
循环结束以后查看 data
的内存
发现是 MZ
开头,显然是一个 PE 文件,我们把它 dump 下来
发现还是用 C#
写的 .net 文件,继续用 dnspy 反编译,里面有一个巨大的 if
里面有个 array
数组
我们需要知道 num
数组里到底有些啥,直接上 z3
即可。
1 | from z3 import * |
然后执行下面的代码
1 | num = [0 for i in range(13)] |
得到 hgame{z3_1s_very_u5eful_1n_rever5e_engin3ering}
cpp
函数调用反编译出来是 fastcall
, 没办法静态找到调用的是哪个函数,直接动调就行。
跳到 v6
这里的 时候,结合下面的函数调用,很像一个密钥的初始化函数,但是不知道是啥加密算法,但是无所谓,我们接着跟踪代码对输入的 flag
进行了什么操作,进入第二个调用
动调到箭头指向的这一步,发现在异或之前,flag
都没有改变,于是考虑直接把与flag
异或的值给 dump
出来,注意这里应该是改了大小端序的。
后面进入 check
函数
跟踪进入函数sub_7FF7A87A4990
,发现是memcpy
找到相对应的参数,可以 dump 出密文
写出 exp
1 |
|
运行得到 hgame{Cpp_1s_much_m0r3_dlff1cult_th4n_C}
shellcode
golang逆向,一眼看见 base64_decode
函数,考虑直接把解码后的 shellcode
dump出来
然后贴到 010editor 里用 ida64 打开,创建函数反编译以后发现是个 TEA ,密钥是常数,密文应该就是 flag.enc
写出 exp
1 |
|
得到 hgame{th1s_1s_th3_tutu's_h0mew0rk}