fkillrra 2018. 3. 11. 17:52

LOB 첫 번째 문제를 풀었다.


문제풀이에 앞서


Redhat Linux 6.2는 기본적으로 bash의 버전이 1.14버전이다.

이 버전에서는 0xff를 인식하지 못하는 버그가 있다고 한다.

0xff 가 0x00과 같은 역할을 하게된다.

따라서 중간에 0xff가 들어가게되면 strcpy()같은 문자열을 복사하는 함수에서 복사를 하는 도중 끊기게 된다.

그렇지만 bash2는 이 버그를 고친 2.3버전이기 때문에 bash2를 사용하여야 Payload에 0xff를 넣을 수 있다.


이러한 점을 알고있어야한다.


따라서 /bin/bash 대신 /bin/bash2를 사용하여 문제를 풀이하였다.



ID : gate / PW : gate 로 로그인을 하면 gremlin 이라는 바이너리와 gremlin.c 라는 c 파일이 존재한다.


gremlin.c 파일을 열어보면 다음과 같이 strcpy()의 사용으로 bof가 일어날 수 있는데

strcpy()는 문자열을 복사해주는 용도로 사용이 되지만 길이를 제한하지 않아 Overflow가 일어날 수 있다.


또한 gremlin이라는 파일에는 



이처럼 setuid가 걸려있다.


gremlin 바이너리를 실행시키면 gremlin의 권한을 잠시 빌려 실행을 하기때문에

이 파일을 이용하여 쉘을 띄운다면 gremlin의 권한으로 쉘이 실행된다.


char buf[256]의 위치를 확인하기 위해 gdb로 열어보았다.



sub esp , 0x100 으로 스택에 256byte를 할당해놨다.


스택구조는 이러하다.

| char buf[256] | SFP | RET |


char buf 다음으로 오는 SFP를 덮고, RET에 쉘코드의 주소를 입력하면 쉘을 띄울 수 있다.


이에 따라 먼저 쉘코드를 환경변수에 등록해준다.



그리고 fkillrra 라는 환경변수의 주소를 구하기 위해 c 파일 하나를 만들어준다.



실행을 하게 되면



환경변수의 주소를 구할 수 있고 이 주소를 return address에 덮어주면 shell을 띄울 수 있다.



이상 LOB LEVEL 01 gate의 풀이를 마친다.

반응형