查壳
无壳,32bit文件,vc++编写的
分析
都是些函数,一开始以为是内存资源解密,动态调试或者找到e_ou资源里的数据进行异或;
发现不是,接着往下面看,
这里解释一下,
- GetTempPathA为检索为临时文件指定的目录的路径,路径长度限制为0x104u,存放在Buffer里面;
- GetTempFileNameA,是在Buffer路径下创建一个名为ou.exe的临时文件;
- fopen打开指定文件写入某些东西;
点击Buffer,
还是需要动调一下,用Local windows试试,断点先下在读取文件路径并创建文件后
再次点击Buffer,
这次就有文件路径了,根据文件路径找到文件
找到了,不过这里还是0kb说明还没有开始写入,回IDAF8单步一下,
好了,再查一下壳看看文件信息
用IDA打开看看
这里sub_401110是个base64解密,根据上面的v3[i]-30就可以完成了。下面还有一些,不晓得是啥,可能是干扰吧。
写个exp
import base64
enc = [
0x78, 0x8B, 0x96, 0x86, 0x78, 0x51, 0x91, 0x50, 0x6C, 0x62, 0x77, 0x53,
0x6C, 0x88, 0x63, 0x50, 0x78, 0x71, 0x4E, 0x50, 0x6B, 0x98, 0x77, 0x53,
0x6A, 0x72, 0x77, 0x97, 0x6C, 0x8B, 0x77, 0x92, 0x6C, 0x98, 0x63, 0x50,
0x6D, 0x71, 0x4E, 0x51, 0x6C, 0x62, 0x77, 0x96, 0x6C, 0x98, 0x5F, 0x50,
0x6B, 0x72, 0x81, 0x51, 0x6C, 0x88, 0x64, 0x57
]
# -30
ascii_str = ''.join([chr(byte - 0x1E) for byte in enc])
flag = base64.b64decode(ascii_str)
print(flag)
# b'flag{6469616e-6369-626f-7169-746170617761}'
好啦。