House of Force
Last updated
Last updated
AWS 해킹 배우고 실습하기: GCP 해킹 배우고 실습하기:
이 기법은 ()에서 패치되었으며 다음 오류를 생성합니다: malloc(): corrupted top size
테스트하려면 를 사용할 수 있습니다.
이 공격의 목표는 특정 주소에 청크를 할당할 수 있는 것입니다.
힙 할당의 크기를 제어할 수 있는 오버플로우가 필요합니다.
힙 할당의 크기를 제어할 수 있어야 합니다.
공격자가 특정 주소 P에 청크를 할당하여 여기에 값을 덮어쓰려면 다음과 같이 시작합니다. 먼저 top 청크 크기를 -1
로 덮어씁니다(오버플로우를 사용할 수도 있음). 이렇게 하면 malloc이 Top 청크를 항상 충분한 공간이 있는 상태로 mmap를 사용하지 않게 됩니다.
그런 다음 top 청크의 주소와 할당할 대상 공간 사이의 거리를 계산합니다. 이는 해당 크기로 malloc이 수행되어 top 청크가 해당 위치로 이동하도록 하기 위함입니다. 이 차이/크기는 쉽게 계산할 수 있습니다:
따라서 target - old_top - 4*sizeof(long)
크기를 할당하면 (4개의 long은 상단 청크의 메타데이터와 새로 할당된 청크의 메타데이터 때문입니다) 상단 청크를 덮어쓰고자 하는 주소로 이동시킬 수 있습니다.
그런 다음, 대상 주소에서 청크를 얻기 위해 다른 malloc을 수행하십시오.
이 시나리오의 목표는 ret2win으로, 호출될 함수의 주소를 ret2win 함수의 주소로 수정해야 합니다.
이진 파일에는 상단 청크 크기를 수정할 수 있는 오버플로우가 있으며, 이를 -1 또는 p64(0xffffffffffffffff)로 수정합니다.
그런 다음 덮어쓸 포인터가 존재하는 위치로 주소를 계산하고, 현재 상단 청크 위치부터 해당 위치까지의 차이가 malloc
으로 할당됩니다.
마지막으로 원하는 대상을 포함하는 새로운 청크가 할당되며, 이 대상이 ret2win 함수에 의해 덮어쓰입니다.
Input your name:
에는 힙에서 주소를 누출할 수 있는 초기 취약점이 있습니다.
그런 다음 Org:
및 Host:
기능에서 org name을 요청할 때 s
포인터의 64B를 채울 수 있으며, 이는 스택에서 v2의 주소 뒤에 따르는데, 그 다음에는 지정된 host name이 따릅니다. 그 후 strcpy가 s의 내용을 64B 크기의 청크로 복사하게 되므로 host name에 입력된 데이터로 상단 청크의 크기를 덮어쓸 수 있습니다.
이제 임의 쓰기가 가능하므로, atoi
의 GOT를 printf의 주소로 덮어씁니다. 그런 다음 %24$p
로 IO_2_1_stderr
의 주소를 누출할 수 있습니다. 이 libc 누출로 atoi
의 GOT를 다시 system
주소로 덮어쓰고 /bin/sh
를 매개변수로 전달하여 호출할 수 있습니다.
포인터를 지우지 않고 해제된 청크를 재사용할 수 있는 UAF가 있습니다. 일부 읽기 방법이 있기 때문에 GOT에 free 함수의 포인터를 쓰고 나중에 read 함수를 호출하여 libc 주소를 누출할 수 있습니다.
그런 다음, UAF를 악용하여 House of force를 사용하여 왼쪽 공간의 크기를 -1로 덮어쓰고, free 후크에 도달할 수 있는 충분히 큰 청크를 할당한 다음, free 후크를 포함하는 다른 청크를 할당합니다. 그런 다음 후크에 system
의 주소를 쓰고, 청크에 "/bin/sh"
를 쓰고, 그 문자열 내용을 포함하는 청크를 해제합니다.
은 free
를 puts
로 덮어쓰고, 나중에 해제될 포인터에 atoi@got
의 주소를 추가하여 누출하고 이 누출로 다시 atoi@got
를 system
으로 덮어쓰고 /bin/sh
로 호출할 수 있습니다.