728x90
How 2 Heap시리즈의 House of Force기법에 대해서 설명을 해보겠다.
House of Force는 탑청크의 사이즈를 조작을 해서 원하는 곳에 데이터를 쓰는 기법이다.
https://www.lazenca.net/display/TEC/The+House+of+Force블로그를 참조를 해서 읽으면 이해가 잘 될것이다.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int
main(
int
argc,
char
*argv[])
{
int
size;
char
*buf1, *buf2, *buf3;
buf1 =
malloc
(256);
printf
(
"buf1 : "
);
scanf
(
"%s"
,buf1);
printf
(
"Size : "
);
scanf
(
"%d"
,&size);
buf2 =
malloc
(size);
printf
(
"buf3 : "
);
buf3 =
malloc
(256);
scanf
(
"%s"
,buf3);
free
(buf3);
free
(buf2);
free
(buf1);
return
0;
}
이와 같은 코드가 있다고 치자.
첫번째 malloc을 하고난 후 scanf를 하는 부분을 보면 오버플로우가 가능하다.
그럼 Top Chunk의 사이즈를 변경 할 수 있다.(????)
처음에는 어떻게 Top Chunk의 사이즈를 변경 할 수 있는지 몰랐는데 ..
알고보니까 Top Chunk가 마지막에 할당받은 청크의 뒤에 붙어있다고한다...
어쨌든 ! 탑청크의 사이즈를 64비트 기준으로 가장 큰 값인 0xffffffffffffffff로 덮어준다.
그러면 malloc을 원하는 값만큼 해줄 수 있는 것이다.
그러면 원하는 스택 or 함수에 있는 값을 덮을 수 있는 것이다.
여기서 malloc을 할 때 원하는 주소로 갈려면 이 방법을 이용해서 사이즈를 구하면 된다.
아래 그림을 보자.
Malloc Data부분에 값을 적어서 다음 청크인 Top Chunk의 사이즈를 조작해 주자.
사이즈를 조작하면 원하는 원래크기였던 0x20efl보다 더욱 큰 크키를 할당 받을 수 있다.
Wanna Addr은
64비트:0x10000000000000000-"원하는 주소"-"0x10(header size)"-"Top Chunk Address"
32비트:0x100000000-"원하는 주소"-"0x8(header size)"-"Top Chunk Address"
이런 방법으로 구해주면 된다.
그러면 원하는 주소에 원하는 값을 적을 수 있을 것이다.
'SYSTEM HACKING > 기법' 카테고리의 다른 글
Windows Universal Shellcode - 이론 (1) | 2021.04.02 |
---|---|
Return to Csu (0) | 2020.04.26 |
[How2Heap] House of Spirit (0) | 2018.02.01 |
[How2Heap] Fastbin dup into Stack (0) | 2018.01.28 |
Special Chapter-Double Stage Format String Bug (0) | 2018.01.01 |