EYEN

wavlink-wn531p3 본문

대외활동 및 팀플/네뷸라 콘테스트

wavlink-wn531p3

EYEN 2024. 12. 6. 22:44
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