<문제 소스코드>

스택 영역을 사용할 수 없는 문제이다.

RTL을 이용하라고 명시되어있다.

RTL이란, Return-to-Libc의 약자로, Returen Address를 공유 라이브러리로 돌림으로써

라이브러리 함수를 통해 쉘을 실행시키는 기법이다.

메모리 방지 기법 중 DEP가 등장한 후 이를 우회하기 위한 기법으로 등장하였다.

라이브러리 함수로 쉘을 어떻게 실행시키느냐? system, exec* 함수를 이용하면 가능하다.


그런데 그전에... 이 문제는 사실 더 쉬운 방법이 있다.

고로 이번 포스팅에서는 총 두 가지 기법을 소개하려한다.



<ret sled>

첫 번째로 소개할 기법은 ret sled 기법이다.(RTL이 아님) 잘 사용되지는 않지만 RTL 개념 이해에 도움지 되지 않을까....?

스택영역으로 RET를 덮어씌울 수 없으므로, return address에 RET 명령의 주소를 쓰는 것이다.

용어가 같으므로 '명령'과 '영역'을 헷갈리지 마시길.

원래의 페이로드는 dummy+&shellcode+shellcode

ret sled의 페이로드는 dummy+&RET+&shellcode+shellcode

ret sled의 흐름도는


1. ESP가 ret를 가리키고 있다.

2. 정상적인 RET 명령이 수행되면서 ESP는 +4 된다.

3. 우리의 의도대로 RET 명령이 '한 번 더' 실행된다. 이 때 RET 명령으로 점프하게 되는 주소가 shellcode의 주소이다.

4. shellcode가 실행된다.


이런 식으로 \xbf를 제한적으로 한 번 필터링하는 것을 우회할 수 있다.


나중에 ROP(Return Oriented Programming)에 사용하게 될 pop-pop-ret 가젯도 이와 상당히 비슷한 흐름을 가진다.



위와 같이 간단하게 쉘을 획득할 수 있다.

다른 방법으로 JMP ESP도 있다. 가젯의 주소를 알아내야한다는 번거로움이 있을 뿐. 어쨌든.

그래도.. 이번 문제 의도가 RTL이라고 써있고 하니 더 중요한 기법인 RTL을 통해서도 문제를 풀어보자.


<RTL - system>



main 함수 실행 직전에 bp를 건다. 라이브러리를 메모리에 올리기 위해서이다.

우리가 이용할 수 있는 함수는 다양하지만, system 함수가 가장 활용하기 쉬운 함수이므로 system 함수를 사용하자.



우리는 ret 영역을 &system로 overwrite 하고, system("/bin/sh")의 기능을 수행하게 만들면 된다.

즉, system 함수의 인자로 "/bin/sh" 주면 된다. 더 정확하게는, 인자로 "/bin/sh" 문자열의 주소를 줘야한다.

그 인자의 주소는 바로 ebp+8이다.

왜 하필 ebp+8일까? 다음을 보자!



main 함수의 ebp부터 4*4바이트의 메모리를 출력한 것이다.

main 함수의 인자는 argc, argv 총 두개.

앞의 0x00000002는 argc에 해당 하고 주소는 ebp+8이다.

뒤의 0xbffffb24는 argv이고 주소는 ebp+12이다.

ebp+4는 무엇인가? 알다시피 ret address다.

그래서 ebp+8에 인자가 들어가게된다.


이제 페이로드를 구성해보자.



페이로의 기본 구성은 dummy+&system+dummy(4)+&/bin/sh이다.

필자는 /bin/sh를 인자 뒤에 넣었다. 필자는 이제까지의 문제풀이에 환경변수를 사용하지 않았다.

매개인자가 더 편해서.

core 파일에서 esp 레지스터와 멀지 않은 곳에서 /bin/sh의 주소를 알아냈다.

알아낸 주소로 페이로드를 수정하고, exploit을 시도하여 쉘 실행에 성공했다.


<exploit>



심볼릭 링크로 원본에 exploit하여 패스워드를 알아낼 수 있었다.

bugbear의 패스워드는 new divide

'Wargame Writeup > LOB(Redhat)' 카테고리의 다른 글

LOB giant -> assassin  (0) 2015.11.18
LOB bugbear -> giant  (0) 2015.11.18
LOB golem -> darkknight  (0) 2015.11.14
LOB skeletom -> golem  (1) 2015.11.14
LOB vampire -> skeleton  (0) 2015.11.14

WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/