2022. 3. 9. 00:25ㆍSite/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 |