article thumbnail image
Published 2021. 1. 28. 00:01

오늘은 goblin으로 가는 password를 찾아보겠다.

먼저 지난 번에 알아낸 password로 로그인을 해준다.

 

그리고 현재 위치에서 파일 목록을 확인했다. goblin.c 파일이 있다. 이 파일 내용을 출력해보도록 하자.

지난 시간에 했던 cobolt.c 파일과 크게 다를 것 없지만 입력을 인자가 아닌 표준 입력을 통해서 받고 있다. gets 함수는 입력의 크기를 따로 지정하지 않기 때문에 버퍼 오버플로우가 발생할 수 있다. 이번에도 역시 BOF를 이용해서 쉘코드를 실행시킬 수 있다. 하지만 buffer의 크기가 16바이트이기 때문에 쉘코드를 넣을 수 없어 보인다. 따라서 환경변수를 이용해서 해결하겠다.

nop sled와 쉘코드를 합친 환경변수 SHELLCODE를 만들었다.

그 후 getenv.c를 작성하고 SHELLCODE의 주소를 얻었다. getenv.c 실행결과 0xbffffe05이 나왔다.

 

payload를 만들기 전에 goblin.c의 스택 구조를 확인하겠다.

main을 disassembly하고 <main+3>을 보면 메모리가 더미 없이 16바이트만 할당되었다는 것을 알 수 있다.

 

이제 payload를 구성하고, goblin.c는 표준 입력을 통해 값을 전달받기 때문에 파이프를 사용해서 값을 전달해야 한다(리다이렉션도 가능).

 

payload를 전달하니까 쉘코드가 실행됐다. my-pass 명령어로 다음 단계의 password를 알아낼 수 있다. goblin으로 가는 password는 hackers proof다.

 

goblin에 로그인 성공!

 

 

 

 

//\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80//

복사했습니다!