본문 바로가기

Wargame/Pwnable.kr

Pwnable.kr uaf-8pt

 Human 클래스의 give_shell() 함수 안에 system("/bin/sh") 가 있는데 이 함수를 실행시키는 것이 핵심인 듯 하다. introduce() 함수도 public으로 선언되어 있다. 문제의 제목 그대로 UAF(Use After Free) 취약점을 이용해야 한다.






 Man 클래스와 Woman 클래스에서 앞의 Human 클래스를 상속하고 있고 멤버 함수로 introduce() 함수를 둘다 가지고 있다. 즉, 함수 오버라이딩을 하고 있다. 





 main() 함수에는 Human 형 포인터로 Man 클래스와 Woman 클래스를 객체화하고 각각의 메뉴를 출력한다. 1번 메뉴는 생성된 각 인스턴스의 introduce() 함수를 호출하고 3번 메뉴는 생성된 인스턴스를 소멸시킨다. 2번 메뉴에서는 main() 함수에 전달된 첫 번째 인자를 정수로 바꿔 변수 len에 저장하고 그 길이만큼 힙에 공간을 할당해 data 변수에 주소를 반환한다. 또, argv[2]로 전달된 문자열로부터 변수 len만큼 data가 가리키는 힙공간에 읽어 온다. argv[2]에 전달해야할 문자열은 파일명임을 알 수 있다.






 위는 1번 메뉴를 선택했을 시에 m, w 인스턴스를 참조해 introduce() 함수를 실행하는 부분이다. 






 위쪽은 add rax, 0x8 명령을 실행하기 이전이고 아래는 실행 이후이다. RAX 레지스터 값이 0x401570일 땐 Human 클래스 내의 give_shell() 함수 주소를 가리키고 있지만 0x8을 더하게 되면 Man 클래스 내의 introduce() 함수 주소를 가리키게 된다. 즉, 저 RAX 레지스터에 만약 0x401568이 저장된다면 0x8을 더하면서 introduce() 함수가 아닌 give_shell() 함수를 실행할 수 있다.




 2번 메뉴를 해보기 이전에 /tmp/heesoo/tmp 파일에 'AAAAAAAA'를 쓰고 main() 함수의 인자로 주어 디버깅해보자.


 먼저 RSP를 기준으로 보면 맨 아래는 각각 SFP, RET이고 표시한 부분이 RAX 레지스터에 들어가고 이 값이 0x401570을 가리키고 있다.






 UAF 취약점을 이용하기 위해 r 8 /tmp/heesoo/tmp로 실행한 뒤 free -> after -> use 를 차례로 실행한 뒤 스택을 살펴보면 위와 같다. 파일의 내용인 'AAAAAAAA'가 0x246BCA0 에 들어있고 use 메뉴를 선택시 0x246BC50의 값을 RAX로 가져오게 된다. 'AAAAAAAA' 대신 0x401568을 입력하고 이 값을 가리키는 0x246BCA0이 0x246BC50의 위치에 오도록 할 수 있다면 use 메뉴를 실행하면서 give_shell() 함수를 실행할 것이다.





 free -> after -> after -> use 순으로 after를 두번 시행 하고 use를 호출하면 위와 같이 RBP-0x38의 값에 'AAAAAAAA'가 놓이게 된다. 





flag 출력!

'Wargame > Pwnable.kr' 카테고리의 다른 글

Pwnable.kr input-4pt  (0) 2017.05.09
Pwnable.kr unlink-10pt  (0) 2017.05.08
Pwnable.kr dragon-75pt  (0) 2017.05.07
Pwnable.kr simple login-50pt  (0) 2017.05.07
Pwnable.kr brainfuck-150pt  (0) 2017.05.07