1. dlsym함수를 사용하여 공유 라이브러리에서 printf함수의 symbol 값을 찾음
2. heapSpray함수를 실행하여 size 값을 입력 받음
3. 입력받은 size값 만큼 new를 이용하여 Heap할당하고 값 입력받음
4. UAF Class 생성
5. UAF Class 삭제
6. heapSpray함수 실행
7. uaf -> target함수 실행
size에 100을 입력, 터미널이라 문자열로 들어가 값을 직접 변경해야함set $rdi = 100heapSpray()안에 있는 data부분에 AAAA를 넣고 vtable 생성
정상적으로 값이 잘 들어감rsi의 값은 Create vtable에서 입력해줬던 100터미널에서 입력했기 때문에 문자열로 입력되어 숫자로 변경
'rax' - 가장 중요한 레지스터로 시스템 콜의 실질적 번호를 가리키는 번호, 함수 결과값이 담기는 레지스터
'rbx' - base register로 메모리 주소를 지정할 때 사용
해당 코드에서는 UAF 취약점이 있음.
UAF 클래스가 삭제된 후 HeapSpray함수를 이용해서 UAF 클래스와 동일한 크기의 heap 영역을 할당 받으면 UAF 취약성이 발생
이러한 취약점을 이용해 쉘 획득 가능
Heap spray를 이용해 Heap 영역을 One Gadget 주소로 채움 -> UAF 취약성으로 할당 받은 영역에 Heap spray된 heap 주소를 유추하여 저장 -> 이로 인해 "uaf→target()" 코드는 heap spray된 영역에 저장된 One gadget 주소를 target() 함수의 시작 주소로 판단하고 실행
앞서 할당한 크기와 동일크기 입력AAAABBBBCCCCDDDD 입력후 스택값이 제대로 들어감
Heap Spray
요약
Heap 영역을 확장하며 해당 영역에 특정 값으로 가득 채우는 기술
Heap Spray로 인해 대부분의 아키텍처에서 대규모 Heap이 할당되는 시작 위치 예측 가능
Heap spray는 응용 프로그램에서 Heap 영역의 값을 읽어 해당 주소도 이동하는 함수 포인터를 덮어쓸 수 있는 취약성이 있을 경우에 사용
Heap Feng shui에도 사용됨
Heap 전체에 내가 원하는 코드를 골고루 위치시켜서 예측 가능한 공간에 Payload를 구성하기 위한 기법
예제
예제 코드
분석
1. dlsym함수를 사용하여 공유 라이브러리에서 printf함수의 symbol 값을 찾음
2. heapSpray함수를 실행하여 size 값을 입력 받음
3. 입력받은 size값 만큼 new를 이용하여 Heap할당하고 값 입력받음
4. UAF Class 생성
5. UAF Class 삭제
6. heapSpray함수 실행
7. uaf -> target함수 실행
'rax' - 가장 중요한 레지스터로 시스템 콜의 실질적 번호를 가리키는 번호, 함수 결과값이 담기는 레지스터
'rbx' - base register로 메모리 주소를 지정할 때 사용
해당 코드에서는 UAF 취약점이 있음.
UAF 클래스가 삭제된 후 HeapSpray함수를 이용해서 UAF 클래스와 동일한 크기의 heap 영역을 할당 받으면 UAF 취약성이 발생
이러한 취약점을 이용해 쉘 획득 가능
Heap spray를 이용해 Heap 영역을 One Gadget 주소로 채움 -> UAF 취약성으로 할당 받은 영역에 Heap spray된 heap 주소를 유추하여 저장 -> 이로 인해 "uaf→target()" 코드는 heap spray된 영역에 저장된 One gadget 주소를 target() 함수의 시작 주소로 판단하고 실행
출처: https://www.lazenca.net/display/TEC/11.Heap+Spray
11.Heap Spray - TechNote - Lazenca.0x0
Excuse the ads! We need some help to keep our site up. List Heap Spray Heap spray란 Heap 영역을 확장하면서 해당 영역에 특정 값으로 가득 채우는 기술입니다.Heap spray를 이용해 Exploit의 성공 가능성을 높이기 위해
www.lazenca.net
'Technique' 카테고리의 다른 글