write-up/pwnable

[ftz] level 18: why did you do it

여니두 2019. 8. 27.

18_포인터 활용

 

√ 포인터

포인터 연산자를 이용해 메모리를 옮겨다닐 수 있다.

movPointer.c

- int 타입의 변수들을 사용하지 않고도, *pt 포인터 변수를 이용해 각각의 변수 값을 출력하였다.

 

e=25
d=6
*pt=&c
c=4
b=5
a=10
SFP
RET

- 포인터는 +, - 기호를 사용해 자신이 가리키고 있는 4byte 메모리 주소의 앞뒤로 이동하는 연산이 가능

- +1 연산: 4byte만큼 이동

(4byte 단위로 이동해야만 정확한 주소를 가리킬 수 있기 때문)

 

- check 변수가 0xdeadbeef여야 shellout() 함수가 실행된다.

 

√ 문제 분석

- cat hint 소스코드 살펴보기

√ gdb로 소스코드 분석

procedure prelude 과정

- main+3> stack에 256byte 공간 할당

 

chk_distance.c

- stack의 구조를 확인해보자.

 

fds[132]
count[4]
x[4]
check[4]
string[100]
SFP
RET

 

- 지금까지는 string 배열이 count 변수 같이 조작해야 하는 변수 다음에 선언되어 쉽게 BOF로 값을 바꿀 수 있었지만, 이번에는 그렇지 않다.

- 이번 레벨은 string 배열이 count 변수보다 stack 아래쪽에 있기 때문에 BOF로 count를 조작할 수 없다.

>> BOF를 이용한 변수값 조작이 아닌,

포인터를 조작해 변수값을 바꾸는 기법을 사용해야 함.

 

√ 공격

포인터를 이동시키는 키: 포인터 변수가 아닌, 배열의 인자

 

* 배열의 인자를 증가시키는 방법?

- 배열의 인자는 양의 방향으로 커져야 하지만, 우리가 변조할 check 변수는 반대 방향

>> 배열의 인자를 음의 방향으로 증가시키자!

 

low_memory.c

- string 배열과 check 변수는 4byte만큼 떨어져 있음

* 배열은 포인터와는 달리 배열 인덱스의 증감에 따라 1byte씩 이동시킴

 

** 정리

배열과 포인터로 메모리 주소를 이동할 수 있다!

 

.

.

.

 

- 힌트를 보면 0x08이란 값을 전달해야 string[count] 배열의 count 인덱스를 1byte 감소시킬 수 있다.

- 하지만, read()나 gets() 함수같이 인자값이 아닌 키보드 입력값을 따로 전달받는 경우

16진수값을 전달하려면 파이프를 통해야 함

-  그렇지 않을 경우, 0x08을 입력했을 때 '\', 'x', '0', '8'과 같이 전달됨

>> 스크립트를 통해 정확한 16진수값을 전달하자!

 

python 스크립트로 만들어진 16진수 스트림이 cat에 의해 잡히게 되고,

파이프를 통해 attackme 프로그램에 전달될 것이다.

 

Level 19 Password = swimming in pink

 

√ printf() 함수의 서식문자

1. \n: 줄바꿈

2. \t: 탭 띄우기

3. \a: 삑 하는 알람 소리

4. \b: backspace 효과

5. \특수문자: \ 뒤의 특수문자 출력

6. %%: % 출력

(포맷스트링 취약점 공격 코드 작성 시 도움)

'write-up > pwnable' 카테고리의 다른 글

[ftz] level 20: we are just regular guys  (0) 2019.08.27
[ftz] level 19: swimming in pink  (0) 2019.08.27
[ftz] level 17: king poetic  (0) 2019.08.26
[ftz] level 16: about to cause mass  (0) 2019.08.24
[ftz] level 15: guess what  (0) 2019.08.24

댓글