5.6 KiB
WWW2Exec - __malloc_hook & __free_hook
{% hint style="success" %}
AWS 해킹 학습 및 실습:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 학습 및 실습: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원
- 구독 요금제를 확인하세요!
- 💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
Malloc Hook
공식 GNU 사이트에 따르면, 변수 **__malloc_hook
**은 malloc()
이 호출될 때 호출될 함수의 주소를 가리키는 포인터로, libc 라이브러리의 데이터 섹션에 저장됩니다. 따라서 이 주소를 원 갓젯과 같은 것으로 덮어쓰고 malloc
이 호출되면 원 갓젯이 호출됩니다.
malloc을 호출하려면 프로그램이 호출할 때까지 기다리거나 printf("%10000$c")
를 호출하여 libc
가 힙에 그들을 할당하도록 할 수 있습니다.
원 갓젯에 대한 자세한 정보는 다음에서 확인할 수 있습니다:
{% content-ref url="../rop-return-oriented-programing/ret2lib/one-gadget.md" %} one-gadget.md {% endcontent-ref %}
{% hint style="warning" %} 후크는 GLIBC 버전 2.34 이상에서 비활성화됩니다. 최신 GLIBC 버전에서 사용할 수 있는 다른 기술이 있습니다. 참조: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md. {% endhint %}
Free Hook
이것은 페이지에서 빠른 bin 공격을 남용한 후 정렬되지 않은 bin 공격을 남용한 예제 중 하나에서 남용되었습니다:
{% content-ref url="../libc-heap/unsorted-bin-attack.md" %} unsorted-bin-attack.md {% endcontent-ref %}
바이너리에 심볼이 있는 경우 다음 명령을 사용하여 __free_hook
의 주소를 찾을 수 있습니다:
gef➤ p &__free_hook
포스트에서는 심볼 없이 free 후크의 주소를 찾는 방법에 대한 단계별 가이드를 찾을 수 있습니다. 요약하면, free 함수에서:
gef➤ x/20i free
0xf75dedc0 <free>: push ebx
0xf75dedc1 <free+1>: call 0xf768f625
0xf75dedc6 <free+6>: add ebx,0x14323a
0xf75dedcc <free+12>: sub esp,0x8
0xf75dedcf <free+15>: mov eax,DWORD PTR [ebx-0x98]
0xf75dedd5 <free+21>: mov ecx,DWORD PTR [esp+0x10]
0xf75dedd9 <free+25>: mov eax,DWORD PTR [eax]--- BREAK HERE
0xf75deddb <free+27>: test eax,eax ;<
0xf75deddd <free+29>: jne 0xf75dee50 <free+144>
이전 코드의 중단점에서 $eax
에 free 후크의 주소가 위치합니다.
이제 빠른 bin 공격이 수행됩니다:
- 먼저
__free_hook
위치에서 크기가 200인 빠른 청크를 작업할 수 있다는 것을 발견했습니다: -
gef➤ p &__free_hook
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200
0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000
0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000
0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
- 이 위치에 크기가 0x200인 빠른 청크를 얻으면 실행될 함수 포인터를 덮어쓸 수 있습니다.
- 이를 위해 크기가
0xfc
인 새로운 청크를 만들고 해당 포인터로 병합된 함수를 두 번 호출하여 크기가0xfc*2 = 0x1f8
인 해제된 청크에 대한 포인터를 얻습니다. - 그런 다음, 이 청크에서
fd
주소를 수정하기 위해 편집 함수가 호출됩니다. 이를 통해 빠른 bin의 이전__free_hook
함수를 가리키도록 합니다. - 그런 다음, 크기가
0x1f8
인 청크를 만들어 불필요한 이전 청크를 빠른 bin에서 검색하여 **__free_hook
**에 빠른 bin 청크를 얻습니다. 이 위치에system
함수의 주소로 덮어쓰기합니다. - 마지막으로
/bin/sh\x00
문자열을 포함하는 청크를 삭제 함수를 호출하여 해제하면__free_hook
함수가 트리거되어/bin/sh\x00
을 매개변수로 사용하여 system을 가리킵니다.