FTZ level16

2022. 3. 9. 00:25Site/FTZ

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

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


ls -al을 명령하여 전체 디렉토리와 파일목록을 확인해 보니 이번에도 attackme파일이보이네요

힌트 파일 내용을 보니 함수들도 보이고 포인터함수도 보이네요... 한번 분석을 해보겠습니다

- int형 crap변수선언

- void형 함수포인터 call()선언 (printit 참조함)

- char형 buf배열에 20bytes할당

-fgets함수로 48bytes만큼 입력받아 buf에 전달 -> 버퍼오버플로우 취약점발생

- call() 함수호출 -> printit()호출

-shell()에서는 setreuid가 있으므로 level17의 권한이 있음

-printit()에서는 Hello there 출력

 

이번에도 feget()쪽에서 버퍼오버플로우가 발생할 것 같고

현재코드에서는 포인터함수call() 이 printin()가리키고 있으므로 그대로 진행하면 Hello there문구만 출력될것입니다

다음단계에 가기위해서는 shell()를 통해 setreuid에 접근을 해야됩니다

접근하기위해서는 버퍼오버플로우를 이용하여 포인터함수call()의 주소값이 printin()을 가지지 않고 shell()의 주소값을 가지게 해주면 될 것 같습니다

그러기 위해서는 shell()의 주소값을 확보해야됩니다

 

gdb를 이용해서 attackme를 실행시켜줬습니다

main+3에서 56bytes[0x38]만큼 공간을 할당해주고있고

main+6에서 0x8048500을 [ebp-16]에 대입하는데 코드상에서 포인터함수 call() = printit()부분이거같습니다

-> call() = [ebp-16], printit() = 0x8048500인걸 예상할수있을것같네요...

main+24에서는 fgets의 buf값을 eax에 대입하고 푸쉬해주네요 -> buf = [ebp-56]인것도 예상되네요...

main+36에서는 [ebp-16]을 eax에 대입하여 eax를 call 해줍니다

 

결론 : buf는 ebp-56, call은 ebp-16이므로 buf와 call의 거리 = 40

-> 40을 쓰레기값으로 채워준다음 call()의 위치에다 shell()의 주소값을 넣어주겠습니다

shell()의 주소값을 알기위해 disas shell입력 -> shell()의 첫번째 주소값이 0x080484d0인것을 확인

 

페이로드 작성 : 쓰레기값*40 + shell함수의 주소

 

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

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

FTZ level18  (0) 2022.03.10
FTZ level17  (0) 2022.03.09
FTZ level15  (0) 2022.03.09
FTZ level14  (0) 2022.03.08
FTZ level13  (0) 2022.03.07