해당 문제를 확인해 본 결과
unlink를 이용하여 memory corruption을 일으키는 것으로 예상된다.
해당 문제의 디렉토리 내부를 확인해 본 결과
flag로 예상되는 파일과 솔루션 텍스트 그리고 실제 바이너리와
해당 바이너리에 대한 소스코드가 있는 것으로 확인된다.
바이너리를 실행해본 결과
stack과 heap의 주소를 보여주며, 입력을 받은 뒤 종료되는 것으로 확인된다.
소스코드를 확인해보자.
소스코드를 분석해본 결과.
1. malloc을 이용해 총 4번의 할당(1024, OBJ 3개)을 진행한다.
2. 세 개의 할당된 OBJ 객체를 더블 링크드 리스트 형태로 만드는 로직을 진행한다.
3. 할당된 객체 A의 buffer에 입력을 받는다. (Overflow 취약점 발생)
4. unlink 로직을 진행한다.
unlink 실행 전과 후의 메모리 구성상태를 확인해보겠다.
추가적으로 unlink로직 이전과 이후에
연결관계가 어떠한 식으로 변하는 지에 관한 그림이다.
이러한 주어진 조건들을 취합하여 실제 공격방법을 고민해보자.
A에 버퍼에서 Heap Overflow가 발생하며
이를 통해 B의 연결관계가 정의되어 있는 fd와 bk를 임의로 corruption 할 수 있다.
그 후 unlink가 발생하게 되면 fd와 bk를 참조하여 해당 주소값에 데이터를 쓰게되므로
결과적으로 EIP를 control 할 것으로 예상된다.
해당 부분에서 고민을 많이했다.
B의 fd와 bk에 일반적인 방법으로 Return Address 주소와 shell 함수의 주소를 작성 시
shell 함수의 주소부분을 참조하여 데이터를 쓰려고 하기 때문에 이는 정상적인 방법이 아니다.
메인함수의 에필로그를 살펴보자.
에필로그에서 일반적이지 않게 ecx 레지스터를 이용하여 esp를 지정하는 것을 확인할 수 있다.
구체적으로 main+208과 main+212를 살펴보면 esp를 조작할 수 있는 것으로 확인된다.
esp 즉 ecx-0x4에 Return할 주소를 입력하고
ebp-0x4 변경할 주소가 담긴 곳에 +0x4로 지정해주면
eip를 컨트롤 할 수 있다.
leak된 주소들을 다음과 같이 가정해보겠다.
Starting program: /home/superuser/SECURITY_BOB/PWNABLEKR/unlink/unlink
here is stack address leak: 0xffffcde4
here is heap address leak: 0x804b410
now that you have leaks, get shell!
해당 실행상태에서 main+208에서의 ebp-0x4는 0xffffcdf4이며 해당 주소에는 0xffffce10이 담겨있다.
이후 main+212까지 실행하면
ecx-0x4인 0xffffce0c가 esp가 되며
해당 주소안에는 libc_start_main+247이 Return Address로 지정되어 있다.
결과적으로 우리가 입력할 수 있는 OBJ A의 버퍼의 주소인 0x0804b18에
shell() 함수의 주소인 0x80484eb를 입력한 뒤
ecx에는 0x0804b18+0x4인 0x0804b1c가 담기게 하면 된다.
결과적으로 ebp-0x4에 0x0804b1c를 담게되면 된다.
leak된 주소에서 offset을 계산하자.
Heap's Offset : 0x0804b1c - 0x0804b10 → 0xc
Stack's Offset : 0xffffcde4 - 0xffffcdf4 → 0x10
얻어진 정보를 토대로 익스플로잇 코드를 작성하겠다.
해당 익스플로잇 코드를 서버에서 실행하게 되면
다음과 같이 플래그를 확인할 수 있다.
'PWNABLE > pwnable.kr' 카테고리의 다른 글
asm (6points) (7) | 2019.06.28 |
---|---|
loveletter (50points) (0) | 2018.08.30 |
echo2 (50points) (0) | 2018.08.28 |
echo1 (25points) (0) | 2018.08.26 |
fsb (20points) (0) | 2018.08.24 |