FTZ level11

2022. 3. 4. 00:31Site/FTZ

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

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


먼저 ls-al을 입력하여 전체 파일, 디렉토리 목록을 확인했습니다

attackme라는파일에 setuid가 걸려있습니다

따라서 저희는 attackme라는 취약점을 이용해서 일시적으로 level12의 권한을 획득해야될 것 같습니다

cat을 통해 hint파일의 내용을 확인해 보았습니다

 

*

char str[256]; -> char형 문자열을 256바이트만큼 할당함

setreuid(3092, 3092); -> level12의 권한id값임

strcpy(str, argv[1]) -> 사용자의 입력값을 str에 복사함 [취약점 -> 버퍼오버플로우발생함]

print(str) -> str출력

*

 

일단 확실한것은 argv[1]에서 str으로 복사를 하는데 범위를 지정해 주지 않았기 때문에 strcpy부분에서 버퍼오버플로우가 발생하게됩니다

 

 

tmp폴더안에 attackme를 만들어주지 않았을때 "Couldn't get registers:Operation not permitted" 라는 퍼미션 문제가 발생하여 접근할수가 없어서 tmp폴더안에 attackme를 생성하고 gdb로 attackme의 내부를 확인해주었습니다

 

main+3부분을 보면 0x108(16)[264(10)]만큼 공간을 할당해 주고있는데  str은 256byte이었습니다

따라서 추가된 8byte는 dummy값이라고 예상해 볼수 있습니다...

main + 48부분에 strcpy함수를 호출하며 REP에는 main+53의 주소값이 들어가는걸 확인할수있는데 정확한 위치를 예상하자면 현재 메모리 구조상태를 보시면 아마 str+dummy+sfp 다음이 아닐까 생각이 듭니다

 

*

      [메모리구조(총 272byte)]

ret[4]
sfp[4]
dummy[8]
str[256]

*

 

RET를 조작하기 위해 총 272byte에서 RET값인 4byte를 빼서 268byte를 만들어 줍니다

공격코드는 25byte쉘코드를 사용하겠습니다 

 

*

[25byte 쉘코드]

\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80

*

 

그러면 nop(90) * 243 + 25(공격코드) = 총 268byte의 형태가 되겠네요

strcpy에 입력받을수있게 main+53에 break문을 걸고 쉘코드를 채워주었습니다

 

*

nop[90] -> 어떠한 명령실행 X

*

 

x/100 $esp를 입력해서 스택상태를 보니 0xbfffd940에서 부터 nop값이 들어간것을 확인할 수 있습니다

0xbfffd940를 잡고 공격을  진행하였습니다

그리고 다시 원래 디렉토리로 올라와 공격을 시도하였고

성공적으로 버퍼오버플로우가 실행되었습니다

 

cf)

  • strcpy()는 변수의 범위를 검사하지 않으므로 범위가 벗어나도 버퍼에 값을 저장하여 취약점이 많이 발생해 권장하지 않는 함수라고 합니다[비슷한 함수 -> strcat(), gets(), scanf()...]
  • 쉘코드 : 어셈블리어 -> 기계어, 작은 크기의 코드로 취약점을 공격후 실행됨
  • 버퍼오버플로우는 몇번돌려봐야 이해가 될것같은데 달고나님이 설명하신 버퍼오버플로우가 설명이 잘되있으니 보시면 괜찮을것 같습니다 -> https://blog.dork94.com/95

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

FTZ level13  (0) 2022.03.07
FTZ level12  (0) 2022.03.06
FTZ level10  (0) 2022.02.25
FTZ level9  (0) 2022.02.25
FTZ level8  (0) 2022.02.24