ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [HackerSchool] Level13
    오래된/HackerSchool 2011. 5. 10. 03:55

    [level13@ftz level13]$ cat hint

    #include <stdlib.h>

    main(int argc, char *argv[])
    {
       long i=0x1234567;
       char buf[1024];

       setreuid( 3094, 3094 );
       if(argc > 1)
       strcpy(buf,argv[1]);

       if(i != 0x1234567) {
       printf(" Warnning: Buffer Overflow !!! \n");
       kill(0,11);
       }
    }

    [ level13 hint ]

    이 문제는 Buffer Overflow 공격을 막기 위해 dummy 공간을 이용 exploit code 를 이용한 무분별한 공격을 더디게 만들어주었던 것처럼 이 문제에서 말하려는 security cookie 역시 이와 같은 형태로 만들어지게 되었다.

    이것은 함수시작시 ebp 다음에 security cookie 를 생성하여 push 한 다음 leave 명령이 실행되기 이전에 함수 실행시 저장해둔 security cookie 값이 처음값과 변함이 없는지 즉, buffer overflow 공격이 발생하지 않았는지를 검증하기 위한 용도로 사용 된다. 하지만, 이 값은 컴파일시 생성되는 값으로 변함이 없기 때문에 쉽게 회피가 가능하게 되었다.

    이전 문제들과 다른점이라면, 정확한 변수 i 의 위치를 계산해야 한다는 점이다.

    [level13@ftz tmp]$ gdb -q ./attackme
    (gdb) disas main
    Dump of assembler code for function main:
    0x080484a0 <main+0>:    push   %ebp
    0x080484a1 <main+1>:    mov    %esp,%ebp
    0x080484a3 <main+3>:    sub    $0x418,%esp
    0x080484a9 <main+9>:    movl   $0x1234567,0xfffffff4(%ebp)
    ...[중략]...
    [ attackme 코드 ]

    gdb 를 이용해서 assm 코드를 보면 변수들을 위한 공간으로 0x418(1048) byte 를 할당 하는 것을 볼 수 있다.
    이 때, 메모리 구조를 살펴 보면 아래와 같을 것이다.

    [ buf(1024) ][ dummy(12) ][ i(8) ][ dummy(4) ][ ebp ][ ret ]

    위와 같을 것이다.

    따라서 의미없는 값 으로 앞 1036 byte 를 채우고 뒤에 12 byte 를 0x1234567 로 채운뒤 ret 위치에 이전에 했던 방식처럼 환경변수에 쉘을 올려놓고 그 주소값을 넣어주면 공격이 성공하게 될 것이다.

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

    [HackerSchool] Level15  (0) 2011.05.10
    [HackerSchool] Level14  (0) 2011.05.10
    [HackerSchool] Level12  (0) 2011.05.06
    [HackerSchool] Level11  (0) 2011.04.29
    [HackerSchool] Level10  (0) 2011.04.29

    댓글

Designed by Tistory.