FTZ - LEVEL13
LEVEL13의 힌트이다 . 간단히 소스를 설명해보겟다!
long i = 0x1234567;
long 타입의 변수 i를 선언하구 0x1234567;을 값으로 넣은다.
char buf[1024]; = buf 1024크기를 가진 배열을 선언한다
setreuid(3094, 3094); = level 14의 권한으로 만들어준다
if(argc >1)
strcpy(buf,argv[1]); = argc가 1보다 크면 buf[1024]에 복사해준다
[strcpy = 복사할 때 크기를 체크하지 않는것이 취약점이다!]
if(i != 0x1234567) {
printf(" warnning : Buffer Overflow !!! \n");
kill(0,11);
}
}
level13의 핵심 부분이자 가장 중요한 부분이다!
0x1234567이 아니라면 메시지를 출력하고 kill함수를 실행시켜서
강제 종료 시켜버린다!
[kill(0,11)에서 0은 프로세스 아이디를 뜻하며 11은 시그널 번호를 말한다
시그널 번호 11은 프로세스가 다른 메모리 영역을 침범햇다는 뜻을 내포하고있다.]
*자 여기서 I는 "스택 가드"에 해당된다 .
buf와 ret 주소 사이에 스택가드(long i) 를 만들어서 버퍼 오버 플로우를 시킬떄
스택 가드도 같이 변조되는데 그렇다면 프로그램은 스택 가드가 변조됫다는걸 if문으로 비교해서 알게되고 실행을 못시키게 프로그램을 종료 시켜버리는것이다.
자 그럼 이번 level13은 if문이 i를 비교햇을때 변조되지않았다고 판단하게 만든후 권한을 얻어버리는게 핵심인거같다 .
0x418[1048]이 할당되엇다
아까 소스에서는 buf는 1024였으므로 즉 24만큼의 공간이 더 주어진것이다 .
여기서 0x1234567 즉 I의 값에 4에 공간을 할당한다 .
주어진 24만큼의 공간에서 4를 스택가드에 쓰는군요
스택 가드가 활성화? 되는 부분이다!
스택가드가 활성화 하는부분에 브레이크 포인트를 걸어주고
AAAAAAAA를 넣어줘봅시다!
첫줄에 보시면 0x41414141 0x41414141 이 있군요! 제가 넣은AAAAAAAA가 들어간 모습입니다
쭉쭉쭉 찾아가시다보면 저기 0x01234567 즉 스택가드의 모습이 보이네요
저기에 잇는 0x1234567이 변조되면 kill 함수가 실행되어서 프로그램이 종료가 되버리는군요 ?
그러면 스택가드를 건드리기전까지 쓰레기값을 넣어줘야겟네요
아까 1048의 공간이 할당되엇고 여기서 4는 스택 가드의 값이지요 ?
그렇다면 buf[1024] dummy1[?] i[4] dummy2[?] sfp[4] ret[4] 이렇게 스택이 구성되잇네요
여기서 gdb한걸 읽다보면 dummy값에 12가 주어진것을 알 수 있습니다 .
그렇다면 스택가드 전 까지의 값은 1036이겠군요
총 1048이 주어졋으니 1036+4 = 1040 dummy2의 값은 8이겟네요
buf[1024] dummy1[12] i[4] dummy2[8] sfp[4] ret[4]
셸코드의 값을 구해서 (에그를 이용합니다)
따다다닥 넣어주면 끝납니다!