EYEN
wavlink-wn531p3 본문
v33 = argv;
sub_404160(&unk_418080, argv, envp); // server initialize
dword_418240 = 60;
dword_418224 = 30;
dword_41823C = 20;
dword_418234 = 3;
dword_418238 = 100;
dword_4181F4 = (int)"Protected Area";
dword_418200 = (int)"/cgi-bin";
dword_418208 = (int)"/sbin:/usr/sbin:/bin:/usr/bin";
dword_418254 = (int)&dword_418250;
dword_418250 = (int)&dword_418250;
signal(13, 1); // sigpipe 신호 무시
v3 = 0;
v34 = 0;
v35 = 0;
v36 = 0;
v37 = 0;
LABEL_2:
v32 = v3;
while ( 1 )
{
v38 = getopt(argc, v33, "A:aC:c:Dd:E:fh:H:I:i:K:k:L:l:m:N:n:p:qRr:Ss:T:t:U:u:Xx:y:");// A~ 옵션, :가 붙는 건 옵션에 대한 값 요구
if ( v38 == -1 )
break;
switch ( v38 )
{
case 'A':
dword_418230 = atoi(optarg); // 옵션에 대한 값을 dword_418230에 저장
continue;
case 'C':
v34 = optarg; // 옵션에 대한 값을 v34에 저장
continue;
case 'D':
dword_418220 = 1;
continue;
case 'E':
if ( *(_BYTE *)optarg != '/' ) // 0x2F='/'
{
fprintf(stderr, "Error: Invalid error handler: %s\n", optarg);
goto LABEL_20;
}
dword_4181FC = optarg; // 옵션에 대한 값을 dword_4181FC에 저장
continue;
case 'H':
if ( !sub_405384(optarg) ) // sub_405384:load_handler_script
continue;
fprintf(stderr, "Error: Failed to load handler script %s\n", optarg);
goto LABEL_20;
case 'I': // 값이 '/'로 시작하면 옳지 않은 index page
if ( *(_BYTE *)optarg == 0x2F )
{
fprintf(stderr, "Error: Invalid index page: %s\n", optarg);
goto LABEL_20;
}
sub_4039EC(optarg); // index page로 뭔가..함
continue;
case 'K':
v35 = optarg;
continue;
case 'L':
dword_41820C = optarg;
continue;
case 'N':
dword_418238 = atoi(optarg);
continue;
case 'R':
dword_418228 = 1;
continue;
case 'S':
dword_41821C = 1;
continue;
case 'T':
dword_418224 = atoi(optarg);
continue;
case 'U':
dword_418218 = optarg;
continue;
case 'X':
dword_418248 = 1;
continue;
case 'a':
dword_418244 = 1;
continue;
case 'c':
dword_4181F8 = optarg;
continue;
case 'd':
optarg = strdup(optarg);
strlen(optarg);
v20 = 0;
v38 = (unsigned int)&v29;
while ( *(_BYTE *)(optarg + v20) )
{
if ( *(_BYTE *)(optarg + v20) == 0x2B )
*(_BYTE *)(optarg + v20) = 32;
++v20;
}
if ( sub_4031C0(v38, v20, optarg, v20) >= 0 )
printf("%s", (const char *)v38);
else
fputs("uhttpd: invalid encoding\n", stderr);
goto LABEL_110;
case 'f':
v3 = 1;
goto LABEL_2;
case 'h': // 경로 설정
if ( !realpath(optarg, &unk_41B540) ) // 절대경로로 변환
{
v9 = (const char *)optarg;
v8 = (_DWORD *)_errno_location();
v10 = (const char *)strerror(*v8);
fprintf(stderr, "Error: Invalid directory %s: %s\n", v9, v10);
goto LABEL_20;
}
dword_4181F0 = strdup(&unk_41B540); // 경로를 저장한 주소 dword_4181F0에 저장
continue;
case 'i':
v18 = (_BYTE *)strdup(optarg); // 입력받은 값의 주소를 v18에 저장
optarg = (int)v18;
v19 = (_BYTE *)strchr(v18, '='); // 입력받은 값에 '='이 있는지 검사
if ( *v18 != '.' || !v19 ) // 입력받은 값에 .이 없거나 v19가 false면
{
fprintf(stderr, "Error: Invalid interpreter: %s\n", v18);
goto LABEL_20;
}
*v19 = 0;
sub_404674(v18, v19 + 1);
break;
case 'k':
dword_41823C = atoi(optarg);
continue;
case 'l':
dword_418210 = optarg;
continue;
case 'm':
v21 = crypt(optarg, "$1$"); // MD5로 암호화
puts(v21);
goto LABEL_110;
case 'n':
dword_418234 = atoi(optarg);
continue;
case 'p':
goto LABEL_9;
case 'q':
dword_41822C = 1;
continue;
case 'r':
dword_4181F4 = optarg;
continue;
case 's':
++v36;
uhttpd
strcpy

sub_
fprintf

printf

strcat

fgets

read

read

read(__fd, &DAT_0041b540,0x1000);
1. &DAT_0041b540이 0x1000보다 작으면 버퍼오버플로우 가능
2. 입력 받아서 FUN_00403080에서 사용한 후(헤더 추가해주는 기능하는듯) 그리고 LAB_0040358e 로 다시가서 read 함수 또 실행

accept


accept으로 입력받은 버퍼가 \x02면 / 아니면

'대외활동 및 팀플 > 네뷸라 콘테스트' 카테고리의 다른 글
부팅 과정 알기 (0) | 2024.12.30 |
---|---|
wavlink-wn531p3 lighttpd (0) | 2024.12.12 |
netis.cgi (0) | 2024.11.23 |
BISC 세미나 정리! (0) | 2024.11.23 |
파일 시스템 추출(3) (0) | 2024.11.06 |