LEVEL 15
[level15] passcode : guess what?
(NO DRAG, NO PASSCODE)
hint의 코드를 분석해보자.
이번 문제는 level14와 아주 유사하지만 check 변수가 포인터 변수로 바뀐 것을 볼 수 있다. level15 에서는 다음과 같이 해결한다.
- check 부분에 0xdeadbeef 값을 직접 입력해주는 것이 아니라 0xdeadbeef 값이 들어있는 주소 자체를 넣어주어야 한다.
- if 문 조건식의 check → check에 주소를 넣어주게 되면 간접참조연산자(*)가 이 주소값 안에 있는 값을 읽어올 것이다. 이 주소에는 0xdeadbeef 가 들어있기 때문에 if 문을 pass 한다.
attackme 프로그램을 tmp로 복사하고 gdb를 이용하여 뜯어보자.
- 할당된 메모리 → (0x38 + 0x8) = 64
- 예상되는 메모리 구조 → *buf(20) + dummy(20) + check(4) + dummy(8) + crap(4)+ SFP(4) + RET(4) = 64
이제 0xdeadbeef 를 가지고 있는 주소를 찾아주어야 한다. 우선 if 문에서 0xdeadbeef 값을 비교하므로 메모리 어딘가에 oxdeadbeef 가 존재할 것이다. 우리는 그 주소를 찾아서 *check 에 넘겨주면 된다.
먼저 main 함수의 메모리를 뜯어보자.
다음과 같이 0x80484b2 에 0xdeadbeef 가 들어있는 것을 볼 수 있다. 이제 이 주소를 *check 에 넘겨주자.
쉘이 따지면 my-pass를 통하여 passcode를 얻어내자.
[level16] : about to cause mass
'Pwnable > FTZ' 카테고리의 다른 글
FTZ - level17 [Buffer Overflow 𝜼] (0) | 2020.08.28 |
---|---|
FTZ - level16 [Buffer Overflow 𝜻] (0) | 2020.08.28 |
FTZ - level14 [Buffer Overflow 𝜹] (0) | 2020.08.28 |
FTZ - level13 [Buffer Overflow 𝜸] (0) | 2020.08.28 |
FTZ - level12 [Buffer Overflow 𝜷] (0) | 2020.08.28 |