
CVE-2018-20343에 대한 PoC
이것은 Ken Silverman의 Build Engine에서의 취약점인 CVE-2018-20343에 대한 PoC입니다.
생성된 .map 파일은 버퍼 오버플로를 유발하고 아래와 같이 스택을 덮어씁니다:
DosBox 0.74-2에서의 Open Watcom: 분석자가 스택을 제어합니다
FreeDos 1.2에서: 분석자가 EIP를 제어합니다
취약한 코드는 ENGINE.C에 있습니다:
1935 kread(fil,&numsectors,2);
1936 kread(fil,§or[0],sizeof(sectortype)*numsectors);
변수 sector의 선언된 크기는 MAXSECTORS * sizeof(struct sectortype) = 1024 * 40 = 40960 바이트입니다. 분석자는 numsectors를 제어합니다 (맵 파일에서 읽어오므로). 따라서 40960보다 큰 값으로 numsectors를 초기화하는 맵 파일을 생성하여 오버플로를 유발할 수 있습니다.
Ken Silverman은 kread 함수에 의존하는 코드 (예: 다음 코드 조각)도 취약할 수 있다고 지적했습니다:
ENGINE.C에서:
1938 kread(fil,&numwalls,2);
1939 kread(fil,&wall[0],sizeof(walltype)*numwalls);
1940
1941 kread(fil,&numsprites,2);
1942 kread(fil,&sprite[0],sizeof(spritetype)*numsprites);
2033 kread(fil,palette,768);
2034 kread(fil,&numpalookups,2);
[...]
2046 kread(fil,palookup[globalpal],numpalookups<<8);
2047 kread(fil,transluc,65536);
2453 kread(fil,&artversion,4);
2454 if (artversion != 1) return(-1);
2455 kread(fil,&numtiles,4);
2456 kread(fil,&localtilestart,4);
2457 kread(fil,&localtileend,4);
2458 kread(fil,&tilesizx[localtilestart],(localtileend-localtilestart+1)<<1);
2459 kread(fil,&tilesizy[localtilestart],(localtileend-localtilestart+1)<<1);
2460 kread(fil,&picanm[localtilestart],(localtileend-localtilestart+1)<<2);
2520 kread(fil,&dasiz,4);
2521 //Must store filenames to use cacheing system :(
2522 voxlock[voxindex][i] = 200;
2523 allocache(&voxoff[voxindex][i],dasiz,&voxlock[voxindex][i]);
2524 ptr = (char *)voxoff[voxindex][i];
2525 kread(fil,ptr,dasiz);
KDMENG.C에서:
1155 kread(fil,&dawaversionum,4);
1156 if (dawaversionum != 0) { kclose(fil); return; }
1157
1158 kread(fil,&numwaves,4);
1159 for(i=0;i<numwaves;i++)
1160 {
1161 kread(fil,&instname[i][0],16);
1162 kread(fil,&wavleng[i],4);
1163 kread(fil,&repstart[i],4);
1164 kread(fil,&repleng[i],4);
1165 kread(fil,&finetune[i],4);
1194 kread(fil,snd,totsndbytes);
1214 kread(fil,&kdmversionum,4);
1215 if (kdmversionum != 0) return(-2);
1216 kread(fil,&numnotes,4);
1217 kread(fil,&numtracks,4);
1218 kread(fil,trinst,numtracks);
1219 kread(fil,trquant,numtracks);
1220 kread(fil,trvol1,numtracks);
1221 kread(fil,trvol2,numtracks);
1222 kread(fil,nttime,numnotes<<2);
1223 kread(fil,nttrack,numnotes);
1224 kread(fil,ntfreq,numnotes);
1225 kread(fil,ntvol1,numnotes);
1226 kread(fil,ntvol2,numnotes);
1227 kread(fil,ntfrqeff,numnotes);
1228 kread(fil,ntvoleff,numnotes);
1229 kread(fil,ntpaneff,numnotes);
이 취약점에 대한 PoC는 다음 환경에서 테스트되었습니다:
Build 엔진은 많은 게임에서 사용되었습니다. 아래는 sector 변수를 오버플로하는 PoC에 대해 테스트된 Build 엔진 기반 게임 목록입니다:
| 게임 | 출시일 | 버전 | 상태 |
|---|
| Duke Nukem 3D | 1996 | 1.5 | vulnerable |
| Shadow Warrior | 1997 | 1.2 | vulnerable |
| Redneck Rampage | 1997 | 1.01 | vulnerable |
| Blood | 1997 | 1.0 | 취약하지 않음 |