gremlin의 홈 디렉토리에 있는 colbolt.c를 확인해보면 첫번째 인자값을 버퍼에다 복사하여 버퍼를 출력하는 코드이다. 두가지 방법을 이용하여 문제를 풀어보도록 하자.
1. 환경변수를 이용한 쉘코드 익스플로잇
항상 하던 대로 다음과 같이 SHELLCODE라는, 쉘코드를 담은 환경변수를 저장합니다.
환경변수의 주소를 출력하는 코드를 간단하게 짜고 실행하여 SHELLCODE 환경변수의 주소를 알아낸다.
cobolt 프로그램의 스택을 보면 str에 할당된 16바이트 뒤에 바로 함수 에필로그가 들어가므로 다음과 같이 쉘코드를 짤 수 있다.
2. RTL을 이용한 exploit
RTL : Return-to-libc. 메모리에 적재된 공유 라이브러리를 이용해 원하는 함수를 끌어다 쓰는 공격 기법이다.
일반적으로 C의 system() 함수를 사용하면 안에 "/bin/sh" 함수를 통해 쉘을 얻을 수 있기 때문에 system 함수를 얻어내는 것을 목적으로 한다.
우선 필요한 부분은 system()의 주소와, 사용 될 인자이다. 먼저 cobolt에 gdb를 이용하여 system 함수의 주소를 구해보기로 한다. 그냥 cobolt를 gdb로 돌리면 권한 문제로 실행이 되지 않으니 아래와 같이 tmp의 아래에 복사해주기로 한다.
코어 덤프를 시켜 코어를 직접 gdb에 돌릴 것이다. 코어는 gdb에 아래와 같이 옵션을 추가해야 한다.
core 파일에서 gdb를 돌리면 일반 cobolt를 실행하는 것과 동일하게 나온다. 중간에 아무 부분에서 브레이크를 걸어주고 p system을 해주면, 시스템 함수의 주소가 나온다.
system 함수는 내부에 /bin/sh 문자열을 갖고 있기 때문에 위와 같이 간단한 코드를 짜서 해당 문자열의 주소를 얻어온다.
'Write-Up > LOB' 카테고리의 다른 글
LOB: orc->wolfman (0) | 2019.12.04 |
---|---|
LOB: succubus -> nightmare (0) | 2019.11.28 |
LOB: troll->vampire (0) | 2019.11.28 |
LOB: gate - 수정중 (0) | 2019.11.22 |