ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [L.O.B] Level 11 - skeleton
    Wargame/L.O.B 2022. 11. 1. 06:58
    반응형

    Level 11 - skeleton을 풀어보자.

     

    소스 코드를 보면 다음 Level은 golem이고, stack destroyer라는 힌트가 있다.

    stack destroyer의 내용은 우선 memset 함수를 이용해 buffer의 처음부터 44 바이트를 0으로 초기화한다.

    다음으로 buffer+48 즉, RET 이후부터 스택의 처음까지 모두를 0으로 초기화한다.

    이것으로 인해 앞의 Level들과는 달리 스택을 사용하지 못하고, RET 값만 변조하여 공격을 수행해야 한다.

    <golem 소스 코드의 내용>

     

    정말로 초기화가 되는지 확인을 하기 위해 gdb 분석을 실시해보았다.

    leave 명령어가 있는 <main+166>에 break를 지정하고, 명령어를 입력한 후 레지스터를 보자.

    실제로 모든 스택이 초기화되어 있는 것을 확인할 수 있었다.

    <초기화된 스택 확인>

     

    이 문제를 풀기 위해서는 메모리의 구조에 대한 이해가 필요하다.

    간략하게 그림을 그려보면 프로세스가 실행될 때 메모리가 아래와 같이 구성된다고 생각하면 된다.

    구역별 역할에 대한 자세한 설명은 생략하도록 하자. (많은 곳에서 쉽게 찾을 수 있다.)

    <32bit 메모리의 구조>

     

    Stack은 Kernel 영역을 건드리지 않기 위해 높은 주소에서 낮은 주소로 확장이 된다.

    공격 진행 방향은 Stack 영역보다도 더 낮은 주소에 쉘 코드를 삽입하고, 그 주소를 RET에 넣는 것이다.

     

    그렇다면 그 영역은 어디인가..?? 를 알아보기 위해 구글링을 했다.

    알아낸 바로는 공유 라이브러리 영역이라는 Stack과 Heap 사이의 영역을 사용하는 것이라고 한다.

    라이브러리란 특정한 기능을 가진 코드를 작성한 파일이다.

    이 라이브러리를 이용해 프로그램의 개발 및 유지, 관리를 더 편리하게 할 수 있다.

    그 중 공유 라이브러리는 프로그램의 시작 시 적재되는 라이브러리이다.

     

    특히, LD_PRELOAD라는 환경변수에 라이브러리를 등록하면 공유 라이브러리보다 먼저 참조하게 된다고 한다.

    다시 말해 LD_PRELOAD 환경변수에 파일을 등록하여 프로그램 실행 시 이 환경변수가 먼저 실행되도록 하자.

     

    LD_PRELOAD 환경변수 등록을 위해서는 필요한 과정이 있다.

    먼저, 빈 파일을 만든다. (answer.c)

     

    다음으로 gcc 명령어로 컴파일을 하는데 두 가지 옵션을 추가해준다.

    -shared : 공유 라이브러리를 우선적으로 링크 (공유 라이브러리 없을 시 정적 라이브러리와 링크)

    -fPIC : 독립적인 코드로 목적파일을 생성

     

    마지막으로 컴파일 후 환경변수를 선언하는데, 여기서 중요한 것은 반드시 절대 경로로 지정해야 한다는 것이다.

    <LD_PRELOAD 환경변수 선언>

     

    gdb로 golem 파일을 확인하면 LD_PRELOAD에 의해 공유 라이브러리 영역에 쉘 코드가 들어간 것을 볼 수 있다.

    (esp-1100은 구글링 중 알게 된 것인데, 옛 OS는 저 부근에 공유 라이브러리가 생기는 취약점이 있었다고 한다.)

    0xbffff5c0 부근에 쉘 코드가 들어간 것을 확인할 수 있다.

    <공유 라이브러리 영역에 들어간 쉘 코드>

     

    RET에 쉘 코드가 들어가 있는 공유 라이브러리 영역의 주소인 0xbffff5c7를 삽입하여 페이로드를 작성하자.

    작성한 페이로드를 입력하여 프로그램을 실행하니 golem의 권한으로 쉘이 실행되었다.

    my-pass를 입력하니 비밀번호가 나타났다.

    <나타난 비밀번호>

     

    이번 Level은 앞에서 경험해보지 못한 새로운 개념이 나타나면서 구글링을 많이 했다.

    그럼에도 완벽히 이해하지는 못해 아쉽지만, 다음에 비슷한 문제가 나왔을 때 이 문제를 떠올릴 수 있을 것 같다.

    반응형

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

    [L.O.B] Level 13 - darkknight  (0) 2022.11.04
    [L.O.B] Level 12 - golem  (1) 2022.11.02
    [L.O.B] Level 10 - vampire  (0) 2022.10.20
    [L.O.B] Level 9 - troll  (0) 2022.10.20
    [L.O.B] Level 8 - orge  (0) 2022.10.20

    댓글

Designed by Tistory.