BOF redhat 원정대 cobolt -> goblin

BOF redhat 원정대 cobolt -> goblin

goblin, goblin.c


argv로 입력 값을 받아서 strcpy함수를 사용하여 버퍼에 값을 복사하는 전 문제와 다르게 이번 문제에서는 입력 값은 없고 gets를 이용해서 입력값을 버퍼에 바로 쓰게된다.
gets함수도 입력값의 길이를 체크하지 않기때문에 이 함수를 이용해서 공격을 할 수 있다.

goblin 디스어셈

argv로 입력값을 받을 때는 커맨드 뒤의 인자자리에 바로 인자를 넣으면 되었지만 get로 프로세스가 실행되고 인자를 받아야 하기 때문에 파이프라인을 사용하여 인자를 전달 하여야한다.

인자를 전달하고 메모리를 확인해보면


인자가 들어가 있다. 버퍼의 크기가 작기 때문에 버퍼에 쉘코드를 넣을수 없다. 그래서 비어있는 argv로 쉘코드를 넣고 gets로 버퍼에 쓸때 오버플로를 이용해서 RET를 argv의 주소로 덮어 공격을 할 것이다.

[버퍼][SFP][RET]
[   버퍼  ][RET].............[쉘코드]

argv의 주소를 찾아보자


버퍼보다 아래쪽에 argv로 전달한 AAAA가 들어 있는 것을 볼 수 있다.
이제 argv에 nop+shellcode를 넘기고 gets로 버퍼를 덮어 씌워 공격을 한다.


goblin 권한으로 쉘을 얻었다.

쉘코드 :
 (python -c 'print "A"*20 + "\x60\xfc\xff\xbf"';cat) | ./goblin `python -c 'print "\x90"*10 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"'`

0 개의 댓글:

댓글 쓰기