ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [FTZ Level15 풀이]
    System/FTZ 2018. 2. 16. 19:50

    [Level15 Code]

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
     
    main()
    int crap;
      int *check;
      char buf[20];
      fgets(buf,45,stdin);
      if (*check==0xdeadbeef)
       {
         setreuid(3096,3096);
         system("/bin/sh");
       }
    }  
     
    cs


    문제는 Level14와 매우 흡사하다.

    다른 점이 있다면, check변수가 포인터변수로 변했다는 점이 있다.

    어셈블리에서는 어떻게 달라졌는지 한번 보도록 하자


    [Level15 Assemble]

    보면, [EBP-16]공간에 있는 4Byte를 EAX에 저장하고

    [EAX]에 있는 4Byte를 deadbeef와 비교한다.


    여기서 우리가 주목해야 할 점은 [ ]의 의미이다.

    CMP부분에서 EAX의 대괄호가 없었다면, 그냥 [EBP-16]공간에 deadbeef를 넣어주면 된다.

    하지만 대괄호가 있으면 값을 참조하는 개념이 달라진다.

    DWORD PTR [EAX] = EAX에 저장되어 있는 주소에 저장되어 있는 4Byte를 참조하겠다.

    라는 의미가 되어버린다.

    따라서, 우리는 deadbeef가 저장되어 있는 주소를 [EBP-16]에 저장해줘야 한다.


    objdump로 deadbeef가 어디에 저장되어 있는지 확인해보자

    [0x080484b2]에 deadbeef가 저장되어 있는 것을 확인할 수 있다.

    그럼 저 주소를 스택에 저장해주면?


    보는것 처럼 쉘이 실행된 것을 확인할 수 있다.

    이제 Level16으로 넘어가보자


    'System > FTZ' 카테고리의 다른 글

    [FTZ Level17 풀이]  (0) 2018.02.16
    [FTZ Level16 풀이]  (0) 2018.02.16
    [FTZ Level14 풀이]  (0) 2018.02.16
    [FTZ Level13 풀이]  (0) 2018.02.16
    [FTZ Level12 풀이]  (0) 2018.02.15

    댓글

Designed by Tistory.