UAF!!
새로 배운 취약점이다.
Use After Free
검색해보니 유명한 취약점이었다.

(몰랐다니...)

검색해서 공부한 후 문제를 풀어보았다. 

uaf 문제이다.


(uaf)



문제 화면은 아래와 같다.


(uaf 문제 화면)



Use After Free 버그를 아냐고 물어본다.

Use After Free 버그란 힙영역에서 일어나는 버그이다.
운영체제의 최적화를 위해 운영체제는 힙에 할당하고 해제한 영역을 flag 비트만 설정해둔 뒤 그 영역의 메모리 데이터를 그대로 남겨둔다.
해제한 힙 영역을 재사용 함으로써 문제가 발생한다.
특히 객체지향 언어인 JAVA, C++ 등 에서 더 강력히 발생한다.

이유는 동적으로 힙영역에 객체를 생성하고 해제하게 되면 그 객체 데이터가 힙 영역 메모리에 그대로 남아있기 때문이다.  객체안에 함수가 있다면 그 영역에 함수 포인터가 존재하는데 만약 객체 해제 후 그 객체의 함수를 재사용하는 코드가 있다면 그 영역의 객체 함수 포인터를 내가 원하는 값으로 덮어 씌워서 프로그램의 실행을 움직 일 수 있다.

소스코드를 보면서 전략을 다시 정리해보자!



(소스코드)



체크할 것은 Use After Free 함수의 취약점 조건은
1. 동적으로 메모리를 할당한다. ( 위 코드는 new라는 함수를 이용해 힙영역에 객체를 만든다. )
2. 메모리를 해제한다. ( free, 여기서는 delete로 메모리 해제한다. )
3. 힙 영역에 다시 메모리를 할당한다. ( 2를 입력하면 new를 이용해 메모리 할당한다. )

조건은 충족됬다.
이 프로그램은 실행하자마자 남자, 여자라는 객체를 생성하므로 메모리 해제 후 우리의 데이터를 힙 영역에 넣는다. 넣으면서 함수 주소를 덮어쓸 것이다. (아직 메모리 확인을 안했으므로 여기까지 계획을 세우고 조금 이따가 구체적으로 생각해보자)



(우리가 불러낼 함수)



남자, 여자 객체는 Human에게서 상속받는다. 즉 남자, 여자 객체 안에는 우리가 불러낼 give_shell 함수를 가지고 있는 것이다.



(덮어쓸 함수)



우리가 덮어쓴 후
객체의 함수를 호출해야하는데 위의 introduce를 불러낼 수 있으므로(1번을 누르면)
introduce 함수 주소에 give_shell 함수 주소를 넣을 것이다.

gdb를 이용해 메모리를 확인해보자.
우선 분기문 case 1: 모양이 보인다.



(case 1)



case 1 이므로
introduce 함수를 불러내는 코드이다.
브레이크를 걸고 실행해보면서 introduce 함수를 어떻게 부르는지 알아보자.


(함수 호출)



rbp-0x38 에서 값을 가져와 rax에 넣는다.
그 후 rax주소에 있는 값을 가져와 8을 더하고 함수를 호출한다.

여기서 rax는 0x401570 이었다.



(0x401570 주소)



0x401570 이 주소에서 8을 더한 위치의 값을 빨간색으로 표시했다.
0x004012d2에 뭐가있나 보면


(0x004012d2)



introduce 함수가 보인다.

그렇다면 -8 위치인 0x0040117a 주소를 확인해보자



(0x0040117a)



우리가 원하던 give_shell 함수 주소이다.

정리를 하면
rbp-0x38 주소는 0x00614c50 이고
여기서 가져온 값이 0x401570이다. 만약 이 값이 0x401570-8이라면 
가져와서 8더한 값이 0x401570일테고 우리의 give_shell 함수가 실행될 수 있다.

즉! 0x00614c50 위치에 0x401570-8가 되면 된다.


(덮어쓸 위치)



내가 A 4개를 입력한 파일을 이용하여 데이터를 2번 쓰니 저 위치를 덮어쓰게 되었다.

이제 공격을 해보자.
 0x401570-8 를 파일에 넣어둔다.



(파일 생성)


그 후 free 해준 뒤 데이터를 2번 써준다. (그래야 우리가 원했던 위치에 값이 올라가므로 -> 이 사실은 내가 gdb를 이용해 실험을 해봐서 나온 결과이다.)


(공격 성공)



해당 쉘을 획득 할 수 있었다.

'WarGame > 500 Project' 카테고리의 다른 글

(57/500) pwnable.kr - ascii_easy  (2) 2017.08.09
(56/500) pwnable.kr - asm  (0) 2017.07.14
(54/500) pwnable.kr - cmd1  (0) 2017.07.12
(53/500) pwnable.kr - blackjack  (0) 2017.07.12
(52/500) pwnable.kr - coin1  (0) 2017.07.12

+ Recent posts