下午在吾爱破解里面乱逛的时候看到了一个看起来蛮有意思的cm。看了下评论发现是21年l3h的题,于是玩了玩,顺便记录一下。
原题:L3HCTF2021 Load
32位 windows文件。
拖进ida长这样,输入满足32位且用flag{}包裹
蛮明显了,下面的CreateFileMappingW和MapViewOfFile,搞了一个name的映射
直接猜测是创了子文件。
然后直接看下面的函数,往下一翻,好家伙,这不是傀儡进程吗
没看出来的可以看看这个文章
https://bbs.pediy.com/thread-269588.htm
直接一套组合拳打脸上了属于是。
由于这里输入后直接作为共享内存存到这个l3hsec里了,所以我们只需要看傀儡进程的逻辑就行。这下看来前面的都不用分析了。
直接在第一个WriteProcessMemory下了个断点,看lpBuffer处的内存
很好。
接下来找文件的大小。可以直接在WriteProcessMemory处下断看nSize,加起来就是傀儡文件的大小。这个题里面也可以通过查这串数据的交叉引用找到。我懒得一个个数,直接看交叉引用的函数来得到了。
简单分析可知这里是先通过smc将该大数组全部异或之后得到的傀儡进程的二进制文件。然后上面的448是轮数,一轮6个字节,总共4个函数,4*448*6=0x2a00。网上随便找个idapython脚本dump即可
得到的dump文件拖入ida,查看主函数。发现引用了我们的输入
限定了输入为0~9,a~f的字符,然后转化为数字存在内存里
我的输入是flag{12345678123456781234567812}
然后下方就是将前9字节存入src数组里,将后4字节存入v29里,然后在7e1370那个函数进行矩阵运算。由于我是转专业选手,还没学线代,所以看了半天不晓得是啥(悲
下面就是一堆比较,全部满足输出正确
以下是脚本
duibi1 = [-8, 18, -9, 6, -13, 6, -1, 2, -1]
duibi2 = [13, -3, -30, 7]
print('flag{',end="")
for i in duibi1:
print(hex(i & 0xff)[2:].ljust(2,'0'),end="")
for i in duibi2:
print(hex(i & 0xff)[2:].ljust(2,'0'),end="")
print('}')