ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [L.O.B] Level 14 - bugbear
    Wargame/L.O.B 2022. 11. 5. 07:26
    반응형

    Level 14 - bugbear를 풀어보자.

    소스 코드를 보면 다음 Level은 giant이고, RTL2라는 힌트가 있다.
    앞의 Level과 마찬가지로 RTL 공격 기법을 이용해 문제를 풀 수 있는 것 같다.
    소스 코드는 복잡해 보이지만, 의미들이 주석으로 설명이 되어 있다.
    변수들을 선언하고, 프로그램 실행 시 입력할 인자 갯수에 대한 조건이 걸려 있다.

    다음으로 execve 함수의 주소를 알아내는 명령어가 있다.
    중요한 것은 libc 주소 + 함수 offset으로 라이브러리에 있는 함수의 주소를 알 수 있다는 것이다!!

    그 다음, ret에 execve 함수의 주소를 넣어주어야 정상적으로 동작한다는 것을 나타낸다.
    마지막으로 argv[1]을 buffer에 복사해 넣고, buffer를 출력하면서 프로그램이 종료된다.

    <giant 소스 코드의 내용>


    gdb를 이용해 dummy가 있는지만 간단하게 알아보도록 하자.
    <main+3>을 보면 esp-60 이므로, dummy 값은 없다는 것을 알 수 있다.

    <giant 파일 gdb 분석을 통한 dummy 값 확인>


    문제를 풀기에 앞서, 이번에 필요한 정보는 총 5가지이다.
    execve 함수의 주소, system 함수의 주소, exit 함수의 주소, /bin/sh의 주소, null의 주소가 필요하다.

    페이로드를 어떻게 작성할 지 미리 설명을 해보도록 하자.
    페이로드는 NOP*(buffer+sfp의 크기) + execve + system + exit + /bin/sh + null로 구성이 될 것이다.

    이것은 execve 함수의 인자로 exit, /bin/sh, null이 들어간다.
    execve는 exit가 실행되어 종료되고, system 함수에 /bin/sh가 들어가면서 쉘이 실행된다.

    이제 필요한 정보를 알아보도록 하자.
    gdb를 실행한 후, main 함수에 break를 걸고 동작시킨다.
    print로 execve, system, exit 함수의 주소들을 출력한다.
    (소스 코드의 내용을 경로를 바꿔준 후 실행해 execve 함수의 주소를 알아내도 되지만, 이게 편하다.)

    <함수들의 주소 출력>


    NULL의 주소는 함수가 동작하면서 입력되는 문자열을 보면서 스택 하단부의 빈 곳을 찾으면 된다.
    (x 명령어의 s를 사용하면 된다. -> x/1000s $esp 등)

    <NULL의 주소>


    마지막으로, /bin/sh의 주소를 알기 위해 소스 코드를 작성하고, 컴파일하여 실행한다.
    앞의 Level에서 했던 것이므로 설명은 생략하도록 하자.

    </bin/sh의 주소>


    필요한 정보들은 모두 알아냈다.
    gdb에서 dummy는 없으므로 처음 NOP는 44 바이트만큼 넣어주도록 하자.

    그 후 페이로드를 실행시키면 되는데..
    사실 실행이 되지 않는다.
    execve의 경로 상의 문제가 있다고 한다.

    \x0a가 \n을 의미해, 공백을 나타내면서 \x00처럼 페이로드가 종료가 된다고 한다. (구글링)
    해결 방법으로는 python 명령 전체를 큰 따옴표로 묶어 주는 것이다.
    이렇게 하면, \n을 인자의 일부로 포함시켜 정상적으로 작동이 된다.

    그렇게 페이로드를 작성하고 실행하면 giant의 권한으로 쉘이 실행된다.
    my-pass를 입력하면 비밀번호가 나타난다.

    <나타난 비밀번호>

     


    [간략 풀이]

    더보기

    이 문제의 페이로드는 사실 많이 생략할 수 있다.

    우선 execve 함수의 마지막 인자인 NULL은 필요없다.

    그리고 exit도 필요없다.

     

    execve를 입력하고, system을 입력한 후 4 바이트를 NOP로 채우고 /bin/sh를 넣어도 페이로드는 작동한다.
    이유는 앞의 Level에서 했던 함수의 호출과 인자에 대해 생각을 해보면 쉽게 알 수 있다.

    반응형

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

    [L.O.B] Level 16 - assassin  (0) 2022.11.06
    [L.O.B] Level 15 - giant  (0) 2022.11.06
    [L.O.B] Level 13 - darkknight  (0) 2022.11.04
    [L.O.B] Level 12 - golem  (1) 2022.11.02
    [L.O.B] Level 11 - skeleton  (2) 2022.11.01

    댓글

Designed by Tistory.