Garbage

题目来源于Flare-on2020,的garbage,题目和PE的文件结构息息相关,记录一下解题思路

garbage

修文件

根据给出的提示,知道这是一个破损的upx加壳的pe文件,首先想到用loadPE进行重建,失败。

查看文件的16进制,最下面可以看到:

image-20220304140723392

这里感觉就是文件并没有写完,然后看到WP,用到一个强大的PEviewer:CFF

得知上图看到的是一个截断的 manifest

这个文件可以单独存在,也可以内嵌到PE文件中,默认就是内嵌到PE文件中。保存了程序集所依赖的所有程序集

upx只能用脚本脱壳,程序跑不起来,脚本脱壳报错

1
upx: upxed.exe: OverlayException: invalid overlay size; file is possibly corrupt

这里用CFF解析文件。文件里的manifest段错误,所以可以定位到程序的.rsrc段,因为manifest在rsrc中。 (.rsrc节区可能会存放一个PE文件或者关键字符串)

image-20220304142059443

看到这里的RAW Size和Raw Address,地址是从9E000开始的,大小是400h,再回到winHEX,程序的大小应该是在(9E00+0X400)大小,这样直接用0补全程序大小,然后upx可以顺利脱壳了。

脱壳之后,ida打开

image-20220304142855088

看到这样的信息,没有成功的解析出函数,在之前遇到的一个病毒,在进行aspack脱壳之后也遇到了这样的问题。

没有函数,那就要去看一下她的IAT,ida找到import窗口,啥也没有,确定问题就出现在这里,回到CFF继续修题

image-20220304143108539

看到名字这里是空的,点击这里,会看到:

image-20220304143225409

这些函数,这些函数百度得知在kernel.dll文件里,这里将名称补全,下面哪一行也一样

image-20220304143431693

这是再用ida打开程序,可以正常分析了

image-20220304143511112

分析

看到WriteFile,第二个参数是写进去的内容,直接分析上面那函数:

1
2
3
4
5
6
7
8
9
10
11
12
_DWORD *__thiscall sub_401000(_DWORD *this, int a2, int a3, int v11, int a5)
{
unsigned int v5; // edi

v5 = 0;
*this = a2;
this[1] = a3;
this[2] = v11;
for ( this[3] = 102; v5 < this[1]; ++v5 ) // 20
*(_BYTE *)(*this + v5) ^= *(_BYTE *)(v5 % this[3] + this[2]);
return this;
}

结合上面给出的字符串,进行 解密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
v10 = "nPTnaGLkIqdcQwvieFQKGcTGOTbfMjDNmvibfBDdFBhoPaBbtfQuuGWYomtqTFqvBSKdUMmciqKSGZaosWCSoZlcIlyQpOwkcAgw "
v11 = "KglPFOsQDxBPXmclOpmsdLDEPMRWbMDzwhDGOyqAkVMRvnBeIkpZIhFznwVylfjrkqprBPAdPuaiVoVugQAlyOQQtxBNsTdPZgDH "

v14 = [0x38, 0x0E, 0x02, 0x3B, 0x19, 0x3B, 0x1B, 0x34, 0x1B, 0x0C, 0x23,
0x3E, 0x33, 0x08, 0x11, 0x42, 0x39, 0x12, 0x1E, 0x73]

v12 = [ 0x23, 0x23, 0x33, 0x2C, 0x0E, 0x3F, 0x64, 0x49, 0x0A, 0x1E, 0x0A, 0x04, 0x23, 0x16, 0x02, 0x1A,
0x44, 0x66, 0x08, 0x24, 0x32, 0x11, 0x74, 0x2C, 0x2A, 0x2D, 0x42, 0x0F, 0x3E, 0x50, 0x64, 0x0D,
0x5D, 0x04, 0x1B, 0x17, 0x16, 0x36, 0x03, 0x05, 0x34, 0x20, 0x09, 0x08, 0x63, 0x21, 0x24, 0x0E,
0x15, 0x14, 0x34, 0x58, 0x1A, 0x29, 0x79, 0x3A, 0x00, 0x00, 0x56, 0x58, 0x54]

this_3 = 102

for i in range(20): #文件名
v14[i] =chr(v14[i] ^ ord(v11[(i%this_3)]))
print(''.join(v14))

for i in range(len(v12)): #内容
v12[i] = chr(v12[i] ^ ord(v10[(i%this_3)]))
print(''.join(v12))
#得到下面文件
sink_the_tanker.vbs
MsgBox("Congrats! Your key is: C0rruptGarbag3@flare-on.com")