LEVEL 17
[level17] passcode : king poetic
(NO DRAG, NO PASSCODE)
이 문제에서는 level16과는 다르게 shell 함수가 선언되어 있지 않다. 따라서 shellcode를 export 해주고 이 주소를 call에 덮어야 할 것 같다.
우선 attackme 프로그램을 tmp 디렉토리에 복사해주고, gdb를 이용하여 메모리 구조를 살펴보자.
- 할당된 메모리 → (0x38 + 0x8) = 64
- 예상되는 메모리 구조 → *buf(20) + dummy(20) + call(4) + dummy(4) + crap(4) + dummy(4) + SFP(4) + RET(4) = 64
메모리 구조는 level16과 동일하다. buf + dummy = 40 만큼 NOP로 덮어주고 그 뒤에 call 부분을 shellcode의 주소로 덮어주면 쉘이 실행될 것이다.
이제 shellcode를 export 해주자. 여기서 export 해준 shellcode의 변수명은 환경 변수(프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는, 동적인 값들의 모임)이다.
- export 변수명=데이터값
- echo 변수명 : 변수의 데이터값을 출력
또한 export 시에 환경 변수의 주소가 변화하는 것을 고려하여 앞에 NOP를 추가해준다. 이렇게 NOP를 추가하는 것은 NOP Sled 기법을 사용할 때와 유사하다.
shellcode를 추가하였으니 이제 환경변수 SHELLCODE의 주소를 찾자. 이 때 getenv 함수를 사용하여 주소를 출력하는 프로그램을 생성하자.
- getenv(const char *name)
- char *name : 구하려는 환경 변수의 이름
- 반환값 : 환경변수의 값
컴파일하고 프로그램을 실행하자.
SHELLCODE 주소가 0xbffffc1d 임을 알았다.
이제 명령어를 입력하여 쉘을 따보자. 쉘이 따지면 my-pass를 입력하여 passcode를 얻자.
[level18] : why did you do it
'Pwnable > FTZ' 카테고리의 다른 글
FTZ - level19 [Buffer Overflow 𝜇] (0) | 2020.08.28 |
---|---|
FTZ - level18 [Buffer Overflow 𝜽] (0) | 2020.08.28 |
FTZ - level16 [Buffer Overflow 𝜻] (0) | 2020.08.28 |
FTZ - level15 [Buffer Overflow 𝜺] (0) | 2020.08.28 |
FTZ - level14 [Buffer Overflow 𝜹] (0) | 2020.08.28 |