wargame/Lord Of Buffer overflow

[LOB] cobolt

LimeLee 2018. 8. 7. 02:53

소스코드 분석



gremlin과 비슷하게 인자 첫번째 값을 buffer에 복사한다. 여전히 취약한 함수인 strcpy를 이용한다.

하지만 주석처리된 힌트를 보면 small buffer를 볼 수 있다. cobolt 문제에서는 배열의 크기가 16밖에 되지 않는다.


문제 풀이




cobolt도 역시 strace를 통해 바이너리를 추적하여 ret 주소를 덮어씌우는 위치를 찾아낸다.

cobolt에서는 buffer의 크기 16byte + sfp의 크기 4byte를 가져 21byte 째부터 ret 주소를 덮어씌우는 것을 확인 할 수 있다.

총 20byte의 쉘코드를 삽입 할 수 있지만, gremlin에서 사용했던 20byte가 넘는 쉘 코드를 사용할 수 없을 뿐 더러 20byte보다 작은 값을 쉘코드를 사용했다 하더라도 NOP sled 기법을 이용하기에는 역시나 작은 크기이기 때문에 입력값의 첫 주소를 정확히 맞춰주어야 할 것이다.

그래서 이번엔 환경 변수를 이용한다. 


리눅스에서 /bin/bash 프로그램을 실행 시킬 때, bash 만 입력해도 /bin/bash가 실행되는 이유는 환경변수가 설정되어 있기 때문이다. 특정 명령어를 입력했을 때 먼저 환경변수에 지정된 디렉토리를 탐색하면서 bash라는 프로그램을 실행시킨다. 프로그램 안에서 system을 실행시킬 때는 어떤가? system('ls')라는 명령어를 수행시키는 것을 생각해보면 프로그램도 환경 변수를 읽어온다고 생각할 수 있다. 프로그램이 환경 변수를 읽어 온다면 환경변수에 쉘 코드를 삽입하고 쉘코드를 삽입한 환경변수의 주소로 덮어씌우게 된다면 쉘을 획득할 수 있다.



export를 통해 쉘 코드를 삽입한다. 저장되어 있는 값의 주소가 불안정할 것이라 예상하여 환경변수에 nop sled 기법을 적용시켰다.

이제 쉘 코드를 저장한 환경변수을 불러올 수 있으면 되는데 그럼 프로그램은 환경변수 값을 어떻게 가져올까? 

프로그램은 환경 변수를 스택에 저장해서 실행시킨다. 



그러므로 환경변수의 주소는 gdb를 통해 확인할 수 있다. 0x90을 쓰여진 공간이 쉘코드가 삽입된 환경변수를 저장한 주소라고 생각할 수 있고, nop sled 기법을 사용하고 있어 nop 명령어가 있는 어느 주소 위로만 이동시켜도 쉘을 실행할 수 있다.



꼭 gdb를 이용하지 않아도 LOB 서버는 메모리 보호 기법을 하나도 적용하고 있지 않고 LOB 서버 내에 쓰기 권한이 부여된 디렉토리가 존재하므로 환경 변수를 출력하는 프로그램을 만들어서 주소 값을 얻어 낼 수 있다. 소스코드 참고는 여기서 할 수 있다. http://wantstar.tistory.com/19



최종 페이로드는 "DUMMY * 20 + ( 쉘 코드가 있는 환경 변수의 주소 값 )"이 된다. 위와 같이 쉘을 획득 한 것을 확인 할 수 있다.


'wargame > Lord Of Buffer overflow' 카테고리의 다른 글

[LOB] orc  (0) 2018.08.13
[LOB] goblin  (0) 2018.08.13
[LOB] gremlin  (0) 2018.08.07