학교 수업듣느라 틈틈이 푼 문제이다.
오랜만이다.!



(문제 화면)


부리부리

이름을 봤을 때 힙영역 취약점이라고 예상했다그리고 확인해보니 힙영역의 취약점을 이용한 문제였다.



(프로그램 실행)



문제를 실행해보면 위와 같이 나온다.
기능은 ADD Chunk를 이용해 데이터를 저장할 수 있는데 3개까지 만들 수 있다.
그리고 unlink를 통해 unlink함수를 구현해 놓았구, modify에서는 
기존의 힙의 데이터를 수정할 수 있게 해놓았다.



(전역변수)



취약하다 생각한 것은 A,B,C라는 전역변수를 만들어 두었고, malloc으로 할당받을 때 
각각 A,B,C에 주소를 저장해 놓는 것이었다

그리고 수정할 때 이 A,B,C에서 값을 가져와서 그 주소에 있는 것을 수정했다.



(unlink 취약점)



바로 이부분인데힙영역의 취약점을 일부러 unlink라는 함수를 만들어놔서 구현해 놓았다현재 버전의 시스템에서는 취약점이 막혔기 때문인 것 같다.


(heap overflow)



일단 기본적으로 힙영역 취약점을 이용하려면 heap overflow가 가능해야한다. ADD 함수에서는 전혀 힙오버플로우가 일어나지 않았고 좌절할 뻔했지만 modify가 있었다.
바로 여기서 수정을 하는데 입력을 0x100 바이트 받는다.
나는 GOT를 오버라이트 해서, A,B,C라는 전역변수에 GOT주소를 적고 싶었다그렇게 되면 수정할 때마다 GOT영역을 0x100바이트 내 맘대로 조작할 수 있기 때문이다.
위에서 말했듯 A,B,C라는 전역변수에 malloc을 저장해 두었고, A,B,C 주소 중 가장 끝의 것 C 주소를 선택했다.
 
이제 3번 청크를 수정하면 GOT영역의 데이터에 나의 데이터가 올라간다.
이제 중요한건 system 함수에 /bin/sh 이라는 문자열을 어떻게 전달할 것인가 이다.
 

나는 아주 기맥힌 방법을 생각해냈다.



(공략)



이 부분에서 idx라는 전역변수에서 값을 꺼내오고 확인한 후 puts를 실행하는 과정인데,
여기서 보면 rax를 초기화 하지 않는다.!
 

여기서puts함수를



(덮어쓸 주소)


위 주소로 덮어쓰고, free함수를 system 함수로 덮어쓰면 바로 rax에 있던 값이 system 함수 인자값으로 들어간다.
그렇다면 나는 idx값에 첫번째 청크 주소값 + 0x10 을 넣을 것이다수정할 때 0x10부터 데이터가 들어가고 나는 첫번째 청크에 /bin/sh + 0x00 을 넣을 것이기 때문이다그렇게 되면 /bin/sh 무자열 주소가 system 함수에 전달되는 것이다.
 
그런데 문제가 있었다. Modify 후 가장 먼저 실행되는 것이 puts함수였다즉 puts 함수를 위 주소로 덮어쓰면 제일 먼저 rax값을 설정하는 그 주소를 실행하지 못한다는 것이다.
, puts 함수가 실행되기 전 다른 함수가 실행되어야하고그 함수에 rax값을 설정하는 주소로 덮어써야한다.
 

나는 modify의 카나리 체크함수를 이용하기로 했다일부러 카나리값을 망치게 하는 주소를 free함수에 넣는다그리고 unlink를 실행해 주어 이 주소로 넘어가고이 때 modify에서 puts 함수와 기타 함수를 덮어쓰면 원하는대로 rax값 설정 후 puts 함수로 넘어간다.



(카나리 망치기)


바로 이 주소를 free 함수로!
 

나의 계획을 정리하면 이렇다.



(공략 정리)




(문제 해결)



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

+ Recent posts