#include <syslog.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define BUFLEN 16
#define WORDSIZE 2
#define DWORDSIZE WORDSIZE+WORDSIZE
void mylog(intkind, char *msg){
// 3¹ø Ãë¾àÁ¡, Æ÷¸Ë½ºÆ®¸µ
syslog(LOG_USER | kind, msg);
}
void mycpy(char *dst, char *src){
if(strlen(src) < BUFLEN -1)
while(*src)
*dst++ = *src++;
*dst= '\x00';
}
int main(int argc, char *argv[]){
char buf1[16];
char buf2[16];
char buf3[BUFLEN];
char *buf4;
char *buf5;
char buf6[16];
char *buf7;
int i, len;
if(argc != 12)
exit(0);
// 1¹ø Ãë¾àÁ¡
// argv[1]ÀÇ ±æÀ̰¡ 17¹ÙÀÌÆ® ÀÌ»óÀÏ °æ¿ì NULLÀÌ º¹»çµÇÁö ¾ÊÀ½
// Áï, buf1ÀÌ NULL ¾ø´Â ¹®ÀÚ¿ÀÌ µÇ¾î¹ö¸²
// ÀÌ·Î ÀÎÇØ Â÷ÈÄ ÀÌ»óÀÛµ¿ ȤÀº Ãë¾àÁ¡ÀÌ ¹ß»ý ÇÒ ¼ö ÀÖÀ½
strncpy(buf1, argv[1], sizeof(buf1));
len= atoi(argv[2]);
if (len< 16)
// 2¹ø Ãë¾àÁ¡
// integer overflow ¹ß»ý
// ¿¹¸¦ µé¾î argv[3]ÀÇ °ªÀ» -4·Î ÁÙ °æ¿ì -4=4294967296°¡ µÇ¾î¹ö¸²
memcpy(buf2, argv[3], len);
else {
char *buf= malloc(len+ 20);
if(buf){
// Ãë¾àÁ¡ ¾øÀ½
snprintf(buf, len+20, "String too long: %s", argv[3]);
// 3¹ø Ãë¾àÁ¡, Æ÷¸Ë½ºÆ®¸µ
mylog(LOG_ERR, buf);
}
}
// Ãë¾àÁ¡ ¾øÀ½
mycpy(buf3, argv[4]);
// 4¹ø Ãë¾àÁ¡
// À§ mycpy¿¡ ÀÇÇØ buf3ÀÌ °¡µæ Âû °æ¿ì ¹öÆÛ¿À¹öÇÃ·Î¿ì ¹ß»ý
strncat(buf3, argv[5], sizeof(buf3)-1);
if(fork()){
// Ãë¾àÁ¡ ¾øÀ½
execl("/bin/ls", "/bin/ls", argv[6], 0);
}
// filter metacharacters
char *p;
if(p = strchr(argv[7], '&'))
*p = 0;
if(p = strchr(argv[7], '`'))
*p = 0;
if(p = strchr(argv[7], ';'))
*p = 0;
if(p = strchr(argv[7], '|'))
*p = 0;
if(strlen(argv[7]) < 1024){
buf4 = malloc(20 + strlen(argv[7]));
// Ãë¾àÁ¡ ¾øÀ½
sprintf(buf4, "/bin/cat %s", argv[7]);
// 5¹ø Ãë¾àÁ¡
// $ Ư¼ö ¹®ÀÚ¸¦ ÀÌ¿ëÇÏ¿© ½Ã½ºÅÛ ¸í·É ½ÇÇà °¡´É
// > Ư¼ö ¹®ÀÚ¸¦ ÀÌ¿ëÇÏ¿© root ±ÇÇÑ ÆÄÀÏ º¹»ç °¡´É
system(buf4);
}
// 6¹ø Ãë¾àÁ¡
// integer overflow + Null Pointer Dereference
// argv[8]°ú argv[9]ÀÇ ±æÀ̰¡ °¢°¢ 0x7fffffff(-1)ÀÏ °æ¿ì °á°ú´Â malloc(0)ÀÌ µÊ
// ¸®ÅÏ °ªÀº 0 = Null Pointer Dereference
buf5 = malloc(strlen(argv[8]) + strlen(argv[9]) + 2);
strcpy(buf5, argv[8]);
strcat(buf5, argv[9]);
// 7¹ø Ãë¾àÁ¡, ¹öÆÛ ¿À¹öÇ÷οì
memcpy(buf6, argv[10], strlen(argv[10]));
// 8¹ø Ãë¾àÁ¡, ¸ÅÅ©·Î ¿ì¼±¼øÀ§ ¿À·ù
// #define WORDSIZE 2
// #define DWORDSIZE WORDSIZE+WORDSIZE
// buf7 = malloc(4 * DWORDSIZE);
// 4*2+2=10
buf7 = malloc(4 * DWORDSIZE);
for(i=0; i<4; i++){
// ÃÑ º¹»ç ±æÀÌ : 4+4+4+4=16
memcpy(buf7 + 4 * i, argv[11] + 4 * i, DWORDSIZE);
}
printf("\nGot%s, (%d) %s, %s, %s, %s, %s, %s\n", buf1, len, buf2,buf3, buf4, buf5, buf6, buf7);
} |