본문으로 바로가기

해커스쿨 LOB gremlin 풀이, write-up

category Wargame/LOB 2018. 8. 9. 23:55

gremlin --- hello bof world



우선 gremlin의 디렉토리를 확인한다.





cobolt라는 의심스러운 파일이 존재한다. cobolt는 cobolt의 권한을 가지고 있고, setuid가 걸려있는 파일이다.


cobolt.c를 가지고 cobolt 파일을 만들었을 가능성이 있기 때문에 cobolt.c 파일을 본 뒤 어떤 취약점이 있는지 확인해보자.





배열이 하나 선언되어 있다.(char buffer[16])


우리는 cobolt를 실행할 때 최소 1개 이상의 인자를 전달해야 한다.(if(argc<2))


1개의 인자를 buffer에 전달한 뒤 출력한다.



cobolt의 메모리 구조를 그려보면 아래와 같이 그려볼 수 있다.




하지만 실제 배열이 할당되면서 중간에 gcc가 자동적으로 dummy를 생성할 수 있다.


gdb를 이용해서 소스를 분석해보자. 소스에 permission denied 발생하면 cp 명령을 이용해 파일을 복사하면 권한이 변경되어 분석할 수 있다.





위와 같이 gremlin의 권한으로 coboltcp 파일이 복사된 것을 확인 할 수 있다.





gdb로 분석해보면 dummy가 추가적으로 생성되지 않았음을 확인 할 수 있다.


buffer에 일반적으로 쉘 코드를 삽입하고 buffer의 주소를 RET에 write하여, 쉘을 띄우는데 cobolt.c에서는 buffer size가 16 byte이다. 따라서 buffer는 쉘 코드가 저장되기에 충분하지 않다.



따라서 어딘가에 쉘 코드를 올리고, 주소를 알아야 하는데 가장 편한 방법이 환경 변수를 이용하는 것이다.