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]

셸코드의 값을 구해서 (에그를 이용합니다)


따다다닥 넣어주면 끝납니다!

'해커스쿨 ftz' 카테고리의 다른 글

FTZ-LEVEL15 [gdb로 푸는법]  (0) 2016.04.24
FTZ - LEVEL14  (0) 2016.04.24
FTZ - LEVEL12  (0) 2016.04.22
FTZ - LEVEL11  (0) 2016.04.15
FTZ - LEVEL 10  (0) 2016.04.15

+ Recent posts