[어설픈] FTZ 해커스쿨 Level 13문제풀이

2019. 1. 28. 18:51System Hacking/FTZ

안녕하세요!

오늘은 FTZ level13을

풀어 보도록 하겠습니다!


소스코드를 보니

변수 i가 0x1234567로 선언되고

1024크기의 char형의 버퍼가 선언되네요!


uid level 14로 올려주고 (3094=leve14 id)

저희의 argument 갯수가 1개 이상이면 

argument [1](두번재 argument)을

버퍼에 strcpy하네요!

strcpy할 때 얼만큼

복사할지 정하지 않아서 취약합니다!


그리고 마지막에 i값이 변조됐나

확인하네요!


만약에 변수 i가

초반에 선언됐던 값과 

일치하지 않으면 

"경고!! 버퍼오버플로우야!!"

라고 출력하네요!


약간 메모리 보호기법중에 canary와 비슷하네요

(ebp와 버퍼 사이에 값을 삽입해서

값이 변조됐으면 종료, 안됐으면 그대로 실행하게 하는 기법)




이번에는 gdb로 사용안하고 

직접 노가다로 

i의 위치를 찾아보겠습니다!


일반적으로 선언된 버퍼의 크기보다 

크게 할당되니,


1030개의 a를 입력해보고

계속 해보다가

1035까지는 괜찮고

1036개를 입력하니 segmentation fault가 뜨네요!


여기서 주의할 점은

저희가 입력하는 값 끝에 \n이 들어가기 때문에

저희가 a를 1035개 넣었어도 사실은 1036개가 들어간거에요!


저희가 1036개의 a를 넣었다는 것은 

즉 1036개의 a + \n이니 1037이라는 거고요!


그래서 1037부터 i가 시작된다는 것을 알 수 있는 거에요!

그래서 i가 1037부터 시작하니까

a를 1036개를 넣고


뒤에 바로 /x67/x45/x23/x01을 넣었죠

아니 왜 거꾸로 넣었냐?


little endian이잖아요!

저희에게 보이는 거랑

반대로 넣어야죠!


그래서 이렇게 세팅하고 입력해보니!

아무런 경고나 에러문구가 안뜨죠? 


여기서부터는 level11과 level12에서 했던 걸

그대로 똑같이 하는 겁니다!

(자세한 설명은 level11을 참고하세요 :) )


라이브러리 ASLR체크와 

어떤 라이브러리 사용 됐는지 확인!

사용된 라이브러리에서 

함수를 뽑아내는데 


저희에게 필요한 system 함수의 

주소를 알 수 있죠?


여기도 마찬가지로 사용된 라이브러리

/lib/tls/libc.so.6에서 문자열을 찾아!

/bin/sh 요놈을!

그리고 주소값도 알려줘!(-tx 옵션)


그래서 최종적으로 payload을 완성했습니다!


buf[1024byte]+더미[12byte]+i 변수[4byte]+더미[8byte]+ebp[4byte]+ret addr[4byte]+불러올 함수의 ret addr[4byte]+/bin/sh주소[4byte]

= a*1036+ i 변수[4 byte]+ a * 12+ret addr[4byte]+ aaaa+ /bin/sh [4byte]


(빨간색 부분이 payload를 위해 편의상 합친 부분입니다!)



1. 우선 a 1036개 넣구요! 

2. 그 뒤에 i값 little endian으로 넣구요!

3. a를 12개 넣습니다! 

왜냐면 i 변수에서 RET_ADDR 까지의 크기라서요

4. 그리고  sytem함수의 주소 넣구요!

5. system 함수의 ret 주소(어차피 쉘따면 소용없지만 aaaa로 줬습니다)

6. 그리고 /bin/sh가 적힌 주소를 넣으니


아래와 같이 쉘이 따졌습니다!

고생하셨습니다!