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



(문제 화면)


부리부리

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



(프로그램 실행)



문제를 실행해보면 위와 같이 나온다.
기능은 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


System 해킹을 공부하기에 앞서
실습환경을 구성해본다.

구성할 리눅스 버젼은 Red Hat 6.2 버젼으로 아주아주아주아주 오래된 버젼이다.
간단한 버젼으로 시스템에 입문할 것이다.

Red Hat은 오래된 리눅스이기도 하고 부팅에 문제가 있을 수 있다.
그래서 부팅할 때 맨 처음에 linux-up 이라고 입력을 해주면 된다.




(부팅 요령)



그 후 호스트 이름을 바꿔 줄 것이다.



(/etc/sysconfig/networ)




호스트 이름을 TFA로 바꿔주었다.



(호스트 이름 변경)




그 후 원격 쉘을 이용하여 공부할 것인데 연결이 가능하도록 만들어 줄것이다.
지금 설치된 Red Hat에 PAM 설정이 되어있기 때문에 몇가지 설정 파일을 수정해주어야 한다.

먼저 /etc/securetty에서 원격 터미널을 넣어주어야한다.




(/etc/securetty 설정 파일)




(pts 추가)



pts 는 원격 터미널로 8개 까지 채워준다.

그 후 pam.d 디렉토리에서 login 설정 파일을 수정해 줄 것이다.



(/etc/pam.d/login)




(pam_securetty.so 주석)




맨 윗줄을 주석처리해준다.

그 후 Xshell 에서 원격으로 로그인 할 수 있었다.



(원격 접속)




그 후 기본적으로 Red Hat에 있는 어셈블러가 아닌
인텔 기반의 어셈블러로 공부하기 위해 따로 nasm을 설치 해주었다.



(nasm 다운로드)




그 후 설치해준다!



(설치1)




(설치2)



설치 후 nasm cp 명령으로 /usr/bin 에 복사해준다.
이유는 PATH 경로에 넣기 위해서이다. 어디서든 nasm 명령어로 사용할 것이기 때문이다.



(cp)




그 후 nasm 명령어를 입력하면 명령어로 입력되는 모습을 볼 수 있다.



(설치 완료)




이로써 시스템 공부할 실습환경을 만들었다.



+ Recent posts