ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [L.O.B] Level 9 - troll
    Wargame/L.O.B 2022. 10. 20. 01:35
    반응형

    Level 9 - troll을 풀어보자.

     

    소스 코드를 보면 다음 Level은 vampire이고, check 0xbfff라는 힌트가 있다.

    조건은 앞의 Level 들에서 있는 것도 있고, 없어진 것도 있지만 내용은 다 아니 설명은 생략하자.

    새로운 조건인 here is changed 부분을 보면, argv[1]의 47번째 내용이 \xff가 아니면 문구를 출력하고 종료한다.

    <vampire 소스 코드의 내용>

     

    gdb로 vampire 파일을 더 분석해보자.

    알아내는 정보는 매번 비슷하지만(소스 코드가 비슷비슷), 그래도 사용해보며 익숙해지도록 하자.

    <vampire 파일의 gdb 분석>

     

    break를 leave가 있는 <main+157>에 걸어주면서 main 함수가 끝나기 직전의 스택 상태를 보도록 하자.

    실행할 명령어로는 \xbf를 위치 조건에 맞춰 48개 넣었고, NOP 값을 10만 개를 넣었다.

    그렇다면 왜 이렇게 NOP를 많이 넣었는지 설명해보자.

     

    그동안 공격을 위해 주로 작성하던 페이로드의 길이는 1,000 자 정도가 최대였다.

    그래서 스택의 주소를 보면 항상 0xbfff...이었다.

    그런데, 이번에는 0xbf[ff]...에서 [ff] 부분이 조건에 의해 걸리게 된다.

     

    이것의 해결을 위해 16 진수로 그 크기를 살펴보면 아래와 같다.

    \xff\xff\xff\xbf : 3,221,225,471
    \xff\xff\xfe\xbf : 3,221,159,935

    2의 16제곱(65,536) 만큼 차이가 난다.(0xbfffeff가 [ff] 부분을 변경시켰을 때 가장 0xbfffffff과 가까운 값이다.)

     

    그래서 10만 개 정도의 길이라면 충분히 조건에 걸리지 않는 주소를 RET에 넣을 수 있을 것이라고 생각했다.

    <break 이후 명령 실행>

     

    그렇게 명령을 실행하고, 분석을 해보니 0xbffe7470에서 NOP가 시작되는 것을 알 수 있다.

    이 값을 페이로드를 작성할 때 RET에 넣을 주소로 삼도록 하자.

    <RET에 넣을 주소값>

     

    이제 페이로드를 작성해 프로그램을 실행해보자.

    RET 값을 잘 넣어주고, NOP를 10만 개 넣고, 쉘 코드를 입력하는 것으로 페이로드를 간단히 작성한다.

    프로그램을 실행하니 vampire의 권한으로 쉘이 실행되며, my-pass 입력 시 비밀번호가 나타난다.

    <나타난 비밀번호>

    반응형

    'Wargame > L.O.B' 카테고리의 다른 글

    [L.O.B] Level 11 - skeleton  (2) 2022.11.01
    [L.O.B] Level 10 - vampire  (0) 2022.10.20
    [L.O.B] Level 8 - orge  (0) 2022.10.20
    [L.O.B] Level 7 - darkelf  (0) 2022.10.14
    [L.O.B] Level 6 - wolfman  (0) 2022.10.14

    댓글

Designed by Tistory.