시스템해킹 워게임인 Narnia Level 0 문제입니다.
버퍼오버플로우가 사용된 문제입니다.
접속 후 홈디렉터리에는 특별한 게 없습니다.
워게임에서는 SetUID를 사용한 권한 상승이 많이 이루어지기 때문에, SetUID가 설정된 파일을 찾아보겠습니다.
소유자가 narnia1이며 SetUID가 설정된 파일을 찾았더니, 이 디렉터리를 발견했습니다.
이곳이 문제파일이 모인 디렉터리같네요.
우리는 narnia0이니, 실행할 수 있는 파일은 narnia0 뿐입니다. narnia0.c는 소스코드로 보이네요.
일단 실행해 보았습니다.
val의 값을 0x41414141에서 0xdeadbeef로 바꾸라고 하는 것 같습니다.
buf에는 현재 버퍼에 저장된 값을 보여주고 있고
val에는 val의 값을 보여주고 있습니다.
저는 deadbeef를 입력했지만 실패하였는지, WAY OFF!!!! 가 출력되며 프로그램은 종료되었습니다.
프로그램 소스코드입니다.
val의 값을 0x41414141로 초기화하고
buf엔 값을 초기화시키지 않았으나, 20byte의 공간을 확보하였습니다. char는 길이가 1바이트이므로 20개 할당했으니 20byte가 됩니다.
그리고 간단한 출력문이 나오고
scanf 함수로 buf에 값을 입력받습니다만, 24byte를 입력받고 있습니다. 할당한 공간은 20인데 24를 입력받네요. 사용된 함수도 scanf함수이니, 버퍼오버플로우가 일어날 수 있다고 보여집니다.
그 아랫부분은 buf와 val값을 출력해주고, val값이 0xdeadbeef가 되었다면 상위권한 쉘을 주도록 되어있네요.
이제 문제를 풀어봅시다.
A20개(20byte) 그리고 deadbeef를 입력했습니다. 총 28byte 입력한 것입니다.
buf는 24byte가 할당되어 있으니, 마지막 beef는 짤리고 dead까지만 들어간 것입니다.
그리고 dead가 16진수로 변경된 값이 val에 있는 0x64616564 입니다.
아스키코드 변환값입니다.
0x64616564 -> daed 가 됩니다만, 리틀엔디안방식으로 저장되기 때문에 dead가 아닌 daed로 반대로 저장됩니다.
리틀엔디안 방식은 1byte단위로 반대방향으로 저장되는 방식입니다.
그런데 위 코드를 보면, 문자열 형태로 입력을 받고 있습니다.
우리는 0x00000000 이렇게 4byte 안에다가 deadbeef를 넣어야 하는데, deadbeef를 입력하면 16진수로 변환되어
8byte를 차지하게 됩니다. 그래서 우리는 문자열이 아닌 "16진수 형태"로 deadbeef를 전달해야 합니다.
0xdeadbeef 이렇게 말이에요. 이스케이프 문자를 활용하면 16진수로 전달할 수 있습니다.
이스케이프 문자 \x를 앞에 붙이면 16진수로써 전달되게 할 수 있습니다.
그리고 이스케이프 문자를 인식하게 하려면, echo에 -e 옵션을 붙여주어야 합니다.
문자열은 1글자당 1byte, 16진수는 2글자당 1byte이므로 2개씩 끊어 반대로 입력해 줍니다.
또한, 프로그램 실행 후 echo를 쓰면 명령어로 인식하지 못하기 때문에 값을 파이프로 전달하였습니다.
하지만 val값을 0xdeadbeef로 변경하였는데도 쉘이 획득되지 않았습니다. WAY OFF 문자열도 뜨지 않았지만요.
일단 실패한 건 아니라는 겁니다. 그렇다면 모종의 이유로 쉘이 유지되지 않는 것 같은데요...
cat을 활용하면 됩니다. cat은 인자없이 사용할 경우 입력 대기상태가 됩니다. 사용자의 입력을 그대로 출력하죠. 그리고 쉘을 유지할 수 있습니다.
솔직히 말씀드려 cat 명령어가 정확히 프로그램과 어떻게 연결되어 쉘을 유지할 수 있는지는 모르겠습니다.
어쨌든 이렇게 narnia1의 권한을 얻었군요. 패스워드를 확인해 봅시다.
성공적으로 패스워드를 획득했습니다.