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