-
[L.O.B] Level 11 - skeletonWargame/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