-
[F.T.Z] Level 13Wargame/F.T.Z 2022. 9. 26. 17:42반응형
Level 13을 풀어보자.
Level 13은 앞의 문제들과 비슷한데, 한 가지 방어 개념이 추가되었다.
책에서 설명으로만 보던 것이라 신기한 느낌이다. (유니콘..??)
우선 Level 13의 hint를 살펴보자.
이번에도 strcpy를 사용하고 있으니 공격이 가능할 것 같다.
그런데 long 타입의 i라는 변수가 선언되어있다. (이것이 방어를 위한 장치이다.)
다른 명령어들은 앞의 Level 들에서 충분히 해석을 한 것 같고, 마지막의 kill에 대해서만 알아보자.
구글링을 해보니 Kill 시그널을 보내는 명령어이다.
간단하게 허가되지 않은 메모리 영역으로의 접근을 종료한다고 생각하자.
<hint의 내용>
gdb를 이용해 attackme 파일을 분석을 해보자.
<main+54>를 보면 ebp와 buf 사이에는 1048 바이트의 크기만큼 거리가 있다.
여기에 sfp의 4 바이트를 합하면 ret와의 거리는 1052 바이트만큼 떨어져있다는 것을 알 수 있다.
이렇게만 되면 문제는 참 쉽게 풀리겠지만, 위에서 언급했던 방어 장치를 생각해보아야 한다.
<main+69>를 보면 i의 값인 0x1234567이 ebp와 12바이트만큼 떨어져 있는 것을 알 수 있다.
이 i의 값은 buf와 ret 사이에 있으니 섣부르게 값을 변경했다가는 if 문이 실행되어 프로세스가 종료된다.
그러므로 i의 값이 변경되지 않도록 buf와 i가 떨어진 거리를 구해야 한다.
1048에서 12를 빼면 1036이라는 값은 쉽게 구할 수 있다.
그렇다면 정리를 해보자.
페이로드를 어떻게 넣으면 if 문에 걸리지 않고 공격을 진행할 수 있을까?
1. buf와 i까지의 거리 1036에 NOP을 채운다.
2. i에 있어야 할 값 0x1234657을 넣어준다. (long의 자료형이므로 4 바이트의 값을 가진다.)
3. i와 ret까지의 거리 12만큼 또 NOP을 채운다.
4. 쉘 코드를 선언한 환경변수의 주소를 넣어 쉘 코드가 실행되도록 한다.
이 순서대로 페이로드를 작성하면 공격이 수행될 것이다.
<attackme 파일 분석>
환경변수를 선언하자.
조회 명령은 Level 마다 다르게 해보았다.
<환경변수 선언>
환경변수의 주소를 알아낼 코드를 작성한다.
<환경변수 주소를 알아낼 코드 작성>
컴파일 후 파일을 실행하면 환경변수의 주소가 나타난다.
<환경변수 주소 확인>
그 후 공격진행 과정에 따라 페이로드를 작성해 attackme 파일을 실행하면 쉘이 실행된다.
my-pass 명령어를 입력하면 비밀번호가 나타난다.
<나타난 비밀번호>
그런데, 한 가지 이상한 것이 있었다.
/tmp 디렉터리에서 env 파일을 실행한 것과, 홈 디렉터리에서 env 파일을 실행했을 때 주소가 달랐다.
앞의 Level들에서는 없었던 현상이라 왜 이러는지는 모르겠다..
구글링을 해봐도 알 수 없지만, 더 찾아보도록 해야겠다.
<이상한 점>
위에서는 i를 방어 장치라는 이름으로 풀이를 했다.
사실 이것은 스택 가드의 한 종류이고, 이번 풀이는 이 스택 가드를 해결해야 풀 수 있었다.
간단하게 개념을 설명하자면, 스택 가드는 카나리라고 불리는 무결성 값을 ret와 변수 사이에 넣는다.
이 카나리 값이 변경되는 것을 탐지하여 overflow를 방지하는 방어 장치이다.반응형'Wargame > F.T.Z' 카테고리의 다른 글
[F.T.Z] Level 15 (0) 2022.09.29 [F.T.Z] Level 14 (0) 2022.09.28 [F.T.Z] Level 12 (1) 2022.09.25 [F.T.Z] Level 11 (0) 2022.09.25 [F.T.Z] Level 10 (0) 2022.09.24