ํ์ด๋ ? ์์ฒญ์ ๋ฐ๋ผ ํ ๋น๋๋ฉฐ chunk ํํ๋ก ๋๋ ์ ์๋ ์ธ์ ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ
ํ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ๋๋ malloc() ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํจ
malloc ํจ์์๋ ํฌ๊ธฐ๋ฅผ ์ ํ๋ ์ธ์๊ฐ ํ์ํ๊ณ , ๊ทธ ํฌ๊ธฐ๋งํผ ๊ณต๊ฐ์ ํ ์ธ๊ทธ๋จผํธ์ ํ ๋นํ๋ค. (Top Chunk๋ฅผ ์ฌ์ฉํด ๋ฉ๋ชจ๋ฆฌ ํ ๋น)
๊ทธ๋ฆฌ๊ณ ๋ณด์ด๋ ํฌ์ธํฐ๋ก ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ์ ์์์ฃผ์๋ฅผ ๋ฆฌํดํ๋ค.
mallocํจ์๊ฐ ์ด๋ค ์ด์ ๋ก ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํ์ง ๋ชปํ๊ฒ ๋๋ฉด 0๊ฐ์ ๋ฆฌํดํ๋ค.
malloc์ ๋์ํ๋ ํด์ ํจ์๋ free()์ด๋ค. free ํจ์์๋ ํฌ์ธํฐ ์ธ์๊ฐ ํ์ํ๊ณ , ๋์ค์ ๋ค์ ๊ทธ ๊ณต๊ฐ์ ์ฌ์ฉํ๋ ค๋ฉด ์ธ์ ํฌ์ธํฐ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํด์ ํ๋ค.
char *char_ptr;
// ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น (mem_size ๋ฐ์ดํธ ๋งํผ ํ ๋น)
char_ptr = (char *) malloc(mem_size);
prev_size : ์ด์ chunk์ ํฌ๊ธฐ ( ์ด์ chunk๊ฐ free๋์์ ๋ ์ค์ ๋จ )
size : ํ์ฌ chunk์ ํฌ๊ธฐ (32bits์์ 8byte, 64bits์์ 16byteํฌ๊ธฐ๋ก ํ ๋น๋จ)
-> ํ์ 3bit๋ flag๋ก ์ฌ์ฉ(M,A,P)
PREV_INUSE : ์ด์ chunk๊ฐ ์ฌ์ฉ์ค์ธ ๊ฒฝ์ฐ ์ค์ ๋๋ ํ๋๊ทธ
IS_MMAPPED : mmap()๋ก ํ ๋น๋ chunk์ธ ๊ฒฝ์ฐ ์ค์ ๋๋ ํ๋๊ทธ
NON_MAIN_ARENA : ๋ฉํฐ ์ฐ๋ ๋ ํ๊ฒฝ์์ main์ด ์๋ ๋ ์์ฑ๋๋ ํ๋๊ทธ
fd(forward pointer) : ์์ง ์ฌ์ฉ๋์ง ์์ ๋ค์ chunk์ ์ฃผ์
bk(backward pointer) : ์์ง ์ฌ์ฉ๋์ง ์์ ์ด์ chunk์ ์ฃผ์
malloc ์ ํตํด์ ํ ๋น๋ chunk๋ prev_size, size , dataํ๋ ์ด๋ ๊ฒ ๊ตฌ์ฑ
fd์ bk๋ chunk๊ฐ free๊ฐ ๋๋ฉด ์ธํ ๋จ
Arena ์ข ๋ฅ
- Main Arena : ๋ฉ์ธ ์ฐ๋ ๋๋ก์จ ์์ฑ
- Sub Arena : ์๋ก์ด ์ค๋ ๋๊ฐ ์์ฑ๋์ด ํ ์์ ์ ์ํํ๊ณ ์ ํ ๋ ๋ค๋ฅธ ์ค๋ ๋๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ์ค์ด๊ธฐ ์ํด ์๋ก์ด arena ์์ฑ! main arena์ ๋ฌ๋ฆฌ mmap()์ ํตํด ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ๊ณ mprotect()๋ฅผ ์ฌ์ฉํด ํ์ฅ
House of Force
Chunk : malloc()์ ์ํด ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์์ฒญ์ด ๋ค์ด์จ ๊ฒฝ์ฐ ์ค์ ๋ก ํ ๋น๋ฐ๋ ์์ญ
chunk์ ์ข ๋ฅ : Allocated Chunk , Free Chunk, Top Chunk
TopChunk : ๋ฉ๋ชจ๋ฆฌ์ ๋ง์ง๋ง์ ์๋ ํน๋ณํ chunk์ด๋ค. malloc์ด OS์ ๋ ๋ง์ ๊ณต๊ฐ์ ์๊ตฌํ ๋ TopChunk๋ resize๋๋ค.
House of Force๋ Top chunk์ size์ ์ ์ฅ๋ ๊ฐ์ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋ฎ์ด์ธ์ ์๊ณ , ์ํ๋ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์์ฒญํ ์ ์๋ค๋ฉด ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
- user chunk : ์ฌ์ฉ์๊ฐ ์์ฒญํ ํฌ๊ธฐ
- remainder chunk : ์์ฒญํ ํฌ๊ธฐ์ ๋๋จธ์ง ๋ถ๋ถ์ผ๋ก ์๋กญ๊ฒ top chunk๊ฐ ๋จ
offset = ํ ๋น๋ฐ๊ธฐ ์ํ๋ ์ฃผ์ - ์ฒญํฌ ํค๋์ฌ์ด์ฆ(0x10) - ํ์ฌ ํ์ฒญํฌ ์ฃผ์ - ์ฒญํฌ ํค๋์ฌ์ด์ฆ(0x10)
๋ฐ๋๋ก Top chunk๋ณด๋ค ํฐ chunk๋ฅผ ์์ฒญํ๋ฉด top chunk์ ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๊ฒ ๋จ
remainder : ํ ๋นํ๊ณ ๋จ์ chunk ํฌ๊ธฐ
main arena -> top : top chunk์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์
main arena -> top -> size : top chunk size
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
// ์ฝ๋ ์์
int main(int argc, char *argv[])
{
int size;
unsigned long *buf1, *buf2, *buf3;
fprintf(stderr,"The house of Force");
buf1 = malloc(256);
buf1[33] = 0xffffffffffffffff; // ๋ณํํ chunk์ ํฌ๊ธฐ
buf2 = malloc(0xffffffffffffeee0); // offset
buf3 = malloc(256);
buf3[0] = 0x4141414141414141; // AAAAA..
free(buf3);
return 0;
}
Unsafe Unlink
[์ฐธ๊ณ ]
https://d41jung0d.tistory.com/108
https://www.lazenca.net/pages/viewpage.action?pageId=1148018
'Hacking > System Hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
<ํดํน: ๊ณต๊ฒฉ์ ์์ > 4ํ์ฐจ ์คํฐ๋ (0) | 2022.05.03 |
---|---|
<ํดํน: ๊ณต๊ฒฉ์ ์์ > 3ํ์ฐจ ์คํฐ๋ (0) | 2022.05.01 |
<ํดํน: ๊ณต๊ฒฉ์ ์์ > 2ํ์ฐจ ์คํฐ๋ (0) | 2022.04.28 |
<ํดํน: ๊ณต๊ฒฉ์ ์์ > 1ํ์ฐจ ์คํฐ๋ (0) | 2022.04.25 |
[dreamhack] Return to Library (0) | 2022.04.10 |