오랜만이다.!
(문제 화면)
이름을 봤을 때 힙영역 취약점이라고 예상했다. 그리고 확인해보니 힙영역의 취약점을 이용한 문제였다.
(프로그램 실행)
기능은 ADD Chunk를 이용해 데이터를 저장할 수 있는데 3개까지 만들 수 있다.
그리고 unlink를 통해 unlink함수를 구현해 놓았구, modify에서는
기존의 힙의 데이터를 수정할 수 있게 해놓았다.
각각 A,B,C에 주소를 저장해 놓는 것이었다.
바로 여기서 수정을 하는데 입력을 0x100 바이트 받는다.
나는 GOT를 오버라이트 해서, A,B,C라는 전역변수에 GOT주소를 적고 싶었다. 그렇게 되면 수정할 때마다 GOT영역을 0x100바이트 내 맘대로 조작할 수 있기 때문이다.
위에서 말했듯 A,B,C라는 전역변수에 malloc을 저장해 두었고, A,B,C 주소 중 가장 끝의 것 C 주소를 선택했다.
이제 3번 청크를 수정하면 GOT영역의 데이터에 나의 데이터가 올라간다.
이제 중요한건 system 함수에 /bin/sh 이라는 문자열을 어떻게 전달할 것인가 이다.
여기서 보면 rax를 초기화 하지 않는다.!
그렇다면 나는 idx값에 첫번째 청크 주소값 + 0x10 을 넣을 것이다. 수정할 때 0x10부터 데이터가 들어가고 나는 첫번째 청크에 /bin/sh + 0x00 을 넣을 것이기 때문이다. 그렇게 되면 /bin/sh 무자열 주소가 system 함수에 전달되는 것이다.
그런데 문제가 있었다. Modify 후 가장 먼저 실행되는 것이 puts함수였다. 즉 puts 함수를 위 주소로 덮어쓰면 제일 먼저 rax값을 설정하는 그 주소를 실행하지 못한다는 것이다.
즉, puts 함수가 실행되기 전 다른 함수가 실행되어야하고, 그 함수에 rax값을 설정하는 주소로 덮어써야한다.
(전역변수)
각각 A,B,C에 주소를 저장해 놓는 것이었다.
그리고 수정할 때 이 A,B,C에서 값을 가져와서 그 주소에 있는 것을 수정했다.
(unlink 취약점)
(heap overflow)
바로 여기서 수정을 하는데 입력을 0x100 바이트 받는다.
나는 GOT를 오버라이트 해서, A,B,C라는 전역변수에 GOT주소를 적고 싶었다. 그렇게 되면 수정할 때마다 GOT영역을 0x100바이트 내 맘대로 조작할 수 있기 때문이다.
위에서 말했듯 A,B,C라는 전역변수에 malloc을 저장해 두었고, A,B,C 주소 중 가장 끝의 것 C 주소를 선택했다.
이제 3번 청크를 수정하면 GOT영역의 데이터에 나의 데이터가 올라간다.
이제 중요한건 system 함수에 /bin/sh 이라는 문자열을 어떻게 전달할 것인가 이다.
나는 아주 기맥힌 방법을 생각해냈다.
(공략)
여기서 보면 rax를 초기화 하지 않는다.!
여기서puts함수를
(덮어쓸 주소)
그렇다면 나는 idx값에 첫번째 청크 주소값 + 0x10 을 넣을 것이다. 수정할 때 0x10부터 데이터가 들어가고 나는 첫번째 청크에 /bin/sh + 0x00 을 넣을 것이기 때문이다. 그렇게 되면 /bin/sh 무자열 주소가 system 함수에 전달되는 것이다.
그런데 문제가 있었다. Modify 후 가장 먼저 실행되는 것이 puts함수였다. 즉 puts 함수를 위 주소로 덮어쓰면 제일 먼저 rax값을 설정하는 그 주소를 실행하지 못한다는 것이다.
즉, puts 함수가 실행되기 전 다른 함수가 실행되어야하고, 그 함수에 rax값을 설정하는 주소로 덮어써야한다.
나는 modify의 카나리 체크함수를 이용하기로 했다. 일부러 카나리값을 망치게 하는 주소를 free함수에 넣는다. 그리고 unlink를 실행해 주어 이 주소로 넘어가고, 이 때 modify에서 puts 함수와 기타 함수를 덮어쓰면 원하는대로 rax값 설정 후 puts 함수로 넘어간다.
(카나리 망치기)
나의 계획을 정리하면 이렇다.
(공략 정리)
(문제 해결)
Exploit 작성 후 공격 실행 성공한 모습
'WarGame > 500 Project' 카테고리의 다른 글
(64/500) backdoor - Enter the matrix (0) | 2017.10.31 |
---|---|
(63/500) pwnable.kr - syscall (2) | 2017.10.22 |
(61/500) NOE.systems - double_input (0) | 2017.09.17 |
(60/500) pwnable.kr - crypto1 (0) | 2017.08.27 |
(59/500) pwnable.kr - dragon (0) | 2017.08.17 |