cat hint 명령어로 hint를 확인한다.
strcpy가 있는 코드인 걸 보니
level11과 level12와 같은 BOF문제인 것 같다.
attackme 실행파일을 실행 해보겠다.
아무것도 안뜬다.
그럼 우선 코드를 다시 보도록 하자.
long 타입의 변수 i를 0x1234567로 선언하고
i가 변하게 되면 Warnning: Buffer Overflow !!!를 출력하게 되어있다.
i를 선언한 이유는 스택가드의 역할 을 하기 위해 선언한 것이다.
kill함수는 아래 그림으로 설명하겠다.
즉. if문을 실행하여 i가 0x1234567과 같지 않다면
printf문을 출력하고 kill함수로 인해
함수를 호출하는 프로세스와 같은 그룹에 있는 모든 프로세스에게 signal 11을 보내는 것이다.
이제 GDB 디버거로 자세히 보자.
그동안의 문제들과는 다르게
0x418만큼 공간이 할당되어있다.
0x418은 10진수로 바꾸면 1048이 된다.
그렇다면 원래 1024byte가 할당 되었기 때문에 24는 쓰레기 값이 되는 것이다.
계산해 보면 메모리 구조는 Buffer[1024byte] + Dummy[24byte] + SFP[4byte] + RET[4byte]이다.
자 이제 RET 구역을 뺀 나머지 구역으로 NoP코드와 쉘코드, 스택가드를 채워 넣어야 한다.
그렇다면 순서를 NoP코드 + 쉘코드 + NoP코드 + 스택가드코드 + NoP코드 + RET영역으로
하면 되겠다.
그럼 RET영역을 한번 알아보자.
일단 스택가드가 main+69에서 일어나니 그 전 구간인 main+66에
브레이크를 걸어보겠다.
A는 0x41이므로 0x41이 시작되는 주소인 0xbfffee80을 RET 시작주소로 잡아보겠다.
tmp 디렉토리에서 실행하여 쉘 권한을 얻어 id를 확인해보니
uid가 level13의 권한으로 되어있었다. 아마도 복사본이라서 그런듯하다.
그래서 level13 디렉토리로 이동하여 다시 수행해 보았다.
uid가 level14의 권한이므로 my-pass명령어를 이용하여
level14의 Password를 얻으면 된다.
'코딩 문제 > 해커스쿨' 카테고리의 다른 글
FTZ : level15 (0) | 2019.07.13 |
---|---|
FTZ : level14 (0) | 2019.07.13 |
FTZ : level12 (0) | 2019.07.07 |
FTZ : level11 (0) | 2019.06.29 |
FTZ : level10 (0) | 2019.01.22 |