[ftz] level 18: why did you do it
18_포인터 활용
√ 포인터
포인터 연산자를 이용해 메모리를 옮겨다닐 수 있다.
- 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로 소스코드 분석
- main+3> stack에 256byte 공간 할당
- stack의 구조를 확인해보자.
fds[132] |
count[4] |
x[4] |
check[4] |
string[100] |
SFP |
RET |
- 지금까지는 string 배열이 count 변수 같이 조작해야 하는 변수 다음에 선언되어 쉽게 BOF로 값을 바꿀 수 있었지만, 이번에는 그렇지 않다.
- 이번 레벨은 string 배열이 count 변수보다 stack 아래쪽에 있기 때문에 BOF로 count를 조작할 수 없다.
>> BOF를 이용한 변수값 조작이 아닌,
포인터를 조작해 변수값을 바꾸는 기법을 사용해야 함.
√ 공격
포인터를 이동시키는 키: 포인터 변수가 아닌, 배열의 인자
* 배열의 인자를 증가시키는 방법?
- 배열의 인자는 양의 방향으로 커져야 하지만, 우리가 변조할 check 변수는 반대 방향
>> 배열의 인자를 음의 방향으로 증가시키자!
- 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 |
댓글