본문 바로가기
Security/Reversing

UAF 공격

by jino22 2021. 11. 6.

틀린 부분이 있다면 언제든지 댓글 남겨주세요!


UAF (Use After Free) 취약점

  • 힙(Heap)은 동적으로 메모리 할당(malloc)/해제(free)가 되는 부분.
  • 힙 영역 중 사용 중이 아닌 공간(unused heap)은 이중 연결 리스트로 관리.
    중간에 메모리 해제가 발생하면 해당 영역이 연결 리스트에 추가되며, 새로 메모리 할당 요청이 오면 연결리스트의 첫번째 매칭(first fit)영역을 할당.
  • 할당했던 메모리 해제 후 재할당해서 사용할 때 같은 크기로 재할당 할 경우 이전에 사용(use)했던 메모리 공간을 재사용하게 되는데, 이때 이전에 할당했을 때처럼 사용하는 경우 발생할 수 있는 문제가 UAF(use after free)공격. (최근 운영체제에서는 재할당 X)


해제된 공간 재할당 확인

코드 / 실행 결과

  • Vul을 먼저 힙에 할당(malloc)한 후 해제(free)하고 같은 크기로 ptr을 할당하면 같은 주소가 할당.
  • 이전에 할당 후 해제했던 vul변수에도 접근이 가능하며 같은 주소 값을 가짐.
  • 또한 해당 주소의 데이터를 바꾸면(overflow data) 이전에 사용했던 변수의 데이터(test data)도 변경.

 

UAF 공격

할당한 vuln변수 해제 후 ptr변수에 같은 크기를 할당하면 같은 공간을 가리키고 있다. 

ptr변수에 임의의 값을 입력 받는 경우 vuln의 변수로 해당 영역에 접근이 가능하며, 이때 vuln변수를 재사용하여 ptr의 데이터를 변경할 수 있는 취약점 발생 가능하다. 

아래의 코드에서 정상적인 경우 cleanMemory함수의 주소로 진입하여 메모리를 해제해야 하지만 ptr변수의 메모리의 값을 변경하여 다른 함수로 진행되도록 할 수 있다.

코드

 

실제 데이터를 가지고 있는 영역 즉 Heap 할당 영역에 가 보았다.

ptr1변수에 입력한 데이터가 0x00A70D80 주소에 저장되어 있다.

ptr1변수는 sizeof(_vuln_struct_t)*2 = 56byte만큼의 입력을 받을 수있다. 이 크기는 vuln변수를 할당했을 때와 같다.

vuln->clean 변수가 가졌던 주소값에 저장되어 있는 데이터가 이동할 함수 주소이므로 찾아가면

0x00A70D80 = heap시작 + 0x18 = 0x00A70D98 이다.

* 0x18byte = 4byte(id변수) + 20byte(name변수) = 24byte

할당 영역

 

디버거에서 해당 함수 주소를 담고 있는 메모리에 접근하여 해당 주소를 unused_func주소로 변경하여 보았다. 

함수로 이동 직전에 vuln->clean함수의 주소를 담고 있는 eax레지스터 값을 unused_func함수의 주소(0x00401513)로 변경하였다.

그러면 아래의 결과 화면과 같이 unused_func함수로 들어가 결과가 출력됨을 확인할 수 있다.

디버거에서 값 변경 / 결과
success함수

 

unused_func함수 주소로 가는 입력값을 조작한 공격 코드이다.

overflow시킬 영역까지 적당한 데이터 값을 입력한 후 필요한 위치에 도달하면 알맞은 주소값을 데이터로 넣는다.

아래 코드의 실행 결과를 UAF코드에 입력값으로 넣으면 위에서 디버거로 강제 주소 변경을 했을 때 나왔던 결과화면을 볼 수 있다. 

공격 코드 / 실행 결과

참고: 리버싱과 시스템 해킹의 원리(x64dbg 디버거를 활용한)

728x90
반응형

'Security > Reversing' 카테고리의 다른 글

[Malwarebytes] crackme 1  (0) 2021.12.09
데이터 보호 기법-Canary  (0) 2021.11.11
[CodeEngn] Challenges Basic RCE L20  (0) 2021.10.18
디버깅 탐지 방법  (0) 2021.10.15
[CodeEngn] Challenges Basic RCE L17, L18, L19  (0) 2021.10.14

댓글