FTZ level17

2022. 3. 9. 02:44Site/FTZ

이번시간에는 level17에 대하여 풀어보겠습니다

공부를 하는 입장이니 틀린게 있어도 양해부탁드리겠습니다


먼저 ls -al을 입력하여 전체 디렉토리와 파일확인해 보니 attackme라는 파일이 또 있네요

힌트파일을 열어주었습니다

int형 crap변수선언했고 포인터형함수call()로 printit()을 받고있네요

char형 buf에 20bytes 할당해주고 fgets함수로 48bytes만큼 buf에 할당해줍니다[버퍼오버플로우발생]

level18 ID를 얻을수있는setreuid가 있고 call함수로 호출합니다

이번에는 shell을 실행시켜주는 함수가 없습니다 call함수를 부르고 프로그램을 종료시키기 때문에 현재상태에서는 setreuid에 접근할수가 없겠네요...

이번에는 저번과 다르게 환경변수에 쉘코드를 넣은 쉘주소를 알아낸다음 버퍼오버플로우를 이용하여 포인터함수call()부분을 쉘주소값으로 덮는 방법으로 접근하겠습니다

 

main+3에서 56bytes[0x38]만큼 공간을 확보하고 main+6에서 0x8048490을 [ebp-16]에 대입시킵니다

이부분은 포인터함수call()=printit 부분인거 같으므로 [ebp-16]이 포인터함수call()의 위치이고 0x8048490이 printit()인것으로 예상됩니다 

main+24부분에서는 [ebp-56]을 eax에 대입하므로 fgets함수의 인자로 buf를받는 부분이겠네요 -> buf = [ebp-56]

 

buf의 위치는 [ebp-56]이고 포인터함수call()의 위치는[ebp-16]이므로 buf와 call()의 거리는 40일것같습니다

따라서 40을 쓰레기값으로 채워준다음 포인터함수call()의 시작주소에 쉘코드를 넣면 될 것 같습니다

 

위코드처럼 환경변수에 쉘코드를 등록시켜주었습니다

shell.c에다가 쉘코드의 주소값을 얻을수있는 getenv에 환경변수값을 입력해주고

gcc를 통해 컴파일해서 shell을 실행시키는 쉘코드주소값이 나왔습니다

buf와 포인터함수call()의 공간인 40을 쓰레기값으로 채워준다음 포인터함수call()의 시작주소에 쉘코드주소를 대입하였습니다

 

다음시간에는 level18을 풀어보겠습니다

'Site > FTZ' 카테고리의 다른 글

FTZ level19  (0) 2022.03.10
FTZ level18  (0) 2022.03.10
FTZ level16  (0) 2022.03.09
FTZ level15  (0) 2022.03.09
FTZ level14  (0) 2022.03.08