728x90
반응형
1. 서론
그 유명한 house of series다.
libc 2.27 이하에서만 사용 가능하기에 사실 지금에 와서는 쓸 수 없는 기법임에도 불구하고 아직까지 많은 사랑을 받고 있는 듯.
원문은 아래 링크를 참조.
https://dl.packetstormsecurity.net/papers/attack/MallocMaleficarum.txt
2. 원리
기본적으로 아래가 가능해야 이 기법을 사용할 수 있다.
- libc version이 2.27 이하일 것.
- top chunk size field를 수정할 수 있는 상황. (by overflow or etc)
- heap allocation size를 마음대로 설정할 수 있는 상황. (가능한 음수값, 물론 양수도 가능.)
공격 구조는
top chunk의 size를 최대 값으로 설정하고, 음수 또는 양수의 값을 통한 malloc()을 할당하여 원하는 위치에 값을 쓸 수 있다는 점이다.
주요 원리는
heap 할당 시 그 위치와 크기는 top chunk size field의 주소와 값을 기준으로 위치와 크기가 결정되는데, 만일 top chunk의 크기가 매우 크고 malloc size의 제한이 없다면 어디든 값을 덮어씌울 수 있다는 점이다.
요약하자면 아래와 같이 작동하며,
- heap 할당
- top chunk 크기를 0xffffffff 즉 -1로 만들기
- top chunk 주소와 변조를 원하는 주소의 offset을 확인.
이 때 chunk 할당시 주어지는 pre_size 및 size의 공간인 heap header 부분을 고려하여 32 bit는 -8, 64 bit는 -16을 추가로 빼 준다.
즉, 변조하려는 주소 - top chunk size 주소 - 0x8 or 0x16
을 구해둔다. - 위에서 구한 값으로 heap 할당
- 한번 더 heap 할당하며 변조하고 싶은 크기와 값을 삽입.
64 bit에서 코드로 요약해서 구현하면 아래와 같다.
int main(){
long * ptr, * ptr2;
ptr = malloc (0x10);
ptr = (long *) (((long) ptr) +24); //top chunk size field address
*ptr=-1; //Change the size field of the top chunk to 0xffffffffffffffff
Malloc(-4120); //reduce the top chunk pointer
Malloc(0x10); //allocate blocks to implement arbitrary address writes
}
보통은 stack 영역까지의 거리는 매우 멀기 때문에 음수의 malloc을 통한 상대적으로 가까운 data 영역이나 heap 영역의 값 변조가 주된 대상이 된다.
예제는 아래를 참고하자.
https://wyv3rn.tistory.com/166
3. 결론
heap은 어렵고도 복잡하지만, 그나마 쉬운 방법 중 하나.
다른 house of series는 다음에 기회가 되는대로...
728x90
반응형
'Tips & theory' 카테고리의 다른 글
source code site (0) | 2022.09.19 |
---|---|
gdb core 파일이 생성되지 않을 때 (0) | 2022.09.16 |
linux에서 docker 기본 사용법 (0) | 2022.09.13 |
assembly code 기초 (0) | 2022.09.08 |
docker <-> host 파일 전송 (0) | 2022.09.06 |