
ptmalloc2
(๋ฆฌ๋ ์ค glibc 2.23 ์์ ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํ ๋, ptmalloc2 ๋ผ๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์๋ฅผ ์ฌ์ฉ)
1. Use-After-Free
: ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ์ ์ฌ์ฉํ ํฌ์ธํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ ํด์ ํ์ ์ ์ ํ ์ด๊ธฐํํ์ง ์์์, ๋๋ ํด์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด๊ธฐํํ์ง ์๊ณ ๋ค์ ์ฒญํฌ์ ์ฌํ ๋นํด์ฃผ๋ฉด์ ๋ฐ์ํ๋ ์ทจ์ฝ์
โ
Dangling Pointer
: ์ ํจํ์ง ์์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ
- ํ๋ก๊ทธ๋จ์ด ์์์น ๋ชปํ ๋์์ ํ ๊ฐ๋ฅ์ฑ์ ํค์
- ๊ณต๊ฒฉ์์๊ฒ ๊ณต๊ฒฉ ์๋จ์ผ๋ก ํ์ฉ๋ ์๋ ์์
โ
* malloc ํจ์๋ ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๋ฅผ ๋ฐํํ๋ ํจ์
๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์ ํ ๋นํ ๋์ ํฌ์ธํฐ๋ฅผ ์ ์ธํ๊ณ , ๊ทธ ํฌ์ธํฐ์ mallocํจ์๊ฐ
ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๋ฅผ ์ ์ฅ -> ์ ๊ทผ
๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ ๋ freeํจ์ ์ฌ์ฉ
โ
free ํจ์๋ ์ฒญํฌ๋ฅผ ptmalloc์ ๋ฐํํ๊ธฐ๋ง ํ๊ณ ์ฒญํฌ์ ์ฃผ์๋ฅผ ๋ด๊ณ ์๋ ํฌ์ธํฐ๋ ์ด๊ธฐํํ์ง ์์
-> ๋ฐ๋ก ํฌ์ธํฐ๋ฅผ ์ด๊ธฐํํด์ฃผ์ง ์์ผ๋ฉด ๊ทธ ํฌ์ธํฐ๋ ํด์ ๋ ์ฒญํฌ๋ฅผ ๊ฐ๋ฆฌํค๋ Dangling Pointer๊ฐ ๋จ
โ
โป chunk(์ฒญํฌ) : malloc()์ผ๋ก ํ ๋น ๋ฐ๋ ์์ญ๊ณผ header๋ฅผ ํฌํจํ ์์ญ
// Name: dangling_ptr.c
// Compile: gcc -o dangling_ptr dangling_ptr.c
#include <stdio.h>
#include <stdlib.h>
int main() {
char *ptr = NULL;
int idx;
while (1) {
printf("> ");
scanf("%d", &idx);
switch (idx) {
case 1:
if (ptr) {
printf("Already allocated\n");
break;
}
ptr = malloc(256);
break;
case 2:
if (!ptr) {
printf("Empty\n");
}
free(ptr);
break;
default:
break;
}
}
}
} }์์ ์ฝ๋๋ freeํธ์ถ ์ดํ ์ด๊ธฐํ๋ฅผ ํ์ง ์์์ Dangling Pointer์ ์ํ์ฑ์ ๋ณด์ด๋ ์์ ์ด๋ค.
์ ์์ ์์๋ ptr๋ณ์๋ฅผ ํด์ ํ๊ณ ์ด๊ธฐํํ์ง ์๋๋ค.

๋ฐ๋ผ์ ์ปดํ์ผ์ ํด์ฃผ๊ณ ์ฒญํฌ๋ฅผ ํ ๋น(1)ํ๊ณ ํด์ (2)ํ๋ฉด ptr์ ์ฒญํฌ์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๋ Dangling Pointer๊ฐ ๋๋ค.
ptr์ด ํด์ ๋ ์ฒญํฌ์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์ผ๋ฏ๋ก 2๋ฅผ ๋ค์ ์ ๋ ฅํด์ ํด์ ํ ์ ์๋ค.
=> Double Free Bug (์ํํธ์จ์ด ์ทจ์ฝ์ )
โ
โ
โ
โ
โ
Use After Free (UAF)
: ํด์ ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ ์ ์์ ๋ ๋ฐ์ํ๋ ์ทจ์ฝ์
- ์ด์ ๊ฒฝ์ฐ์ ๋ฌ๋ฆฌ ์๋กญ๊ฒ ํ ๋นํ ์์ญ์ ์ด๊ธฐํํ์ง ์๊ณ ์ฌ์ฉํ๋ฉด์ ๋ฐ์ํ๊ธฐ๋ ํจ
// Name: uaf.c
// Compile: gcc -o uaf uaf.c -no-pie
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct NameTag {
char team_name[16];
char name[32];
void (*func)();
};
struct Secret {
char secret_name[16];
char secret_info[32];
long code;
};
int main() {
int idx;
struct NameTag *nametag;
struct Secret *secret;
secret = malloc(sizeof(struct Secret)); // secret๊ตฌ์กฐ์ฒด ๋จผ์ ํ ๋น
strcpy(secret->secret_name, "ADMIN PASSWORD"); // secret_name, secret_info, code์ ๊ฐ์ ์
๋ ฅ
strcpy(secret->secret_info, "P@ssw0rd!@#");
secret->code = 0x1337;
free(secret); // ํด์
secret = NULL; // ์ด๊ธฐํ
nametag = malloc(sizeof(struct NameTag));
strcpy(nametag->team_name, "security team"); // team_name, name์ ๊ฐ์ ์
๋ ฅ
memcpy(nametag->name, "S", 1);
printf("Team Name: %s\n", nametag->team_name);
printf("Name: %s\n", nametag->name);
if (nametag->func) { // func๊ฐ NULL์ด ์๋๋ฉด ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์ ์ถ๋ ฅ, ํจ์ ํธ์ถ
printf("Nametag function: %p\n", nametag->func);
nametag->func();
}
}

Name๋ก secret_info์ ๋ฌธ์์ด์ด ์ถ๋ ฅ๋๊ณ , ๊ฐ์ ์ ๋ ฅํ ์ ์๋ ํจ์ ํฌ์ธํฐ๊ฐ 0x1337์ ๊ฐ๋ฆฌํจ๋ค.
์ค๊น?
โ
โ
โ
uaf ๋์ ๋ถ์
ptmalloc2๋ ์๋ก์ด ํ ๋น ์์ฒญ์ด ๋ค์ด์์ ๋ ์์ฒญ๋ ํฌ๊ธฐ์ ๋น์ทํ ์ฒญํฌ๊ฐ bin์ด๋ tcache์ ์๋์ง ํ์ธํ ํ, ์๋ค๋ฉด ํด๋น ์ฒญํฌ๋ฅผ ๊บผ๋ด ์ฌ์ฌ์ฉํ๋ค.
โ
secret๊ณผ nametag๋ ๊ฐ์ ํฌ๊ธฐ์ ๊ตฌ์กฐ์ฒด์ด๋ค.
--> secret์ ํด์ ํ๊ณ nametag๋ฅผ ํ ๋นํ๋ฉด nametag๋ secret๊ณผ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ฌ์ฉ
-- free๋ ํด์ ํ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ์ด๊ธฐํํ์ง ์๊ธฐ ๋๋ฌธ์ nametag์๋ secret์ ๊ฐ์ด ์ผ๋ถ ๋จ์



heap - ํ ๋น ๋ฐ ํด์ ๋ ์ฒญํฌ๋ค์ ์ ๋ณด๋ฅผ ์กฐํํ๋ ๋ช ๋ น์ด์ด๋ค.โ

secret์ด ์ฌ์ฉํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ถ๋ ฅํ ๊ฒ์ด๋ค.
secret_name์ ์ ์ ํ fd์ bk๊ฐ์ผ๋ก ์ด๊ธฐํ๋์ง๋ง secret_info์ ๊ฐ์ ๊ทธ๋๋ก ๋จ์์๋ ๊ฑธ ํ์ธํ ์ ์๋ค.
โ
โ
๋ค์์ผ๋ก printfํจ์๋ฅผ ํธ์ถํ๋ ์์ ์์ nametag ๋ฉค๋ฒ ๋ณ์๋ค์ ๊ฐ์ ํ์ธํด๋ณด๊ณ ์ ํ๋ค.

printf ํจ์๊ฐ main+207์์ ํธ์ถ๋๋ ๊ฑธ ํ์ธํ ์ ์๋ค.
โ



nametag->team_name์๋ "security team"์ด ๊ทธ๋๋ก ์ ๋ ฅ๋์์ผ๋,
nametag->name์๋ ์ด๊ธฐํ๋์ง ์์ secret_info์ ๊ฐ์ด ์กด์ฌํ๋ ๊ฑธ ํ์ธํ ์ ์๋ค.
๋ํ nametag->func์์น์ secret->code์ ๋์ ํ๋ 0x1337์ด ๋จ์์๋ ๊ฑธ ํ์ธํ ์ ์๋ค.
โ
if (nametag->func) {
printf("Nametag function: %p\n", nametag->func);
nametag->func();
}

0x1337์ด 0์ด ์๋๊ธฐ ๋๋ฌธ์ ์์ ์์ค์ฝ๋์์ nametag->func๊ฐ ํธ์ถ๋๊ณ , Segmentation fault๊ฐ ๋ฐ์ํ๋ค.
'DreamHack > SystemHacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[System Hacking] 2์ฃผ์ฐจ dreamhack stage 12 - (2) (0) | 2022.04.30 |
---|---|
[System Hacking] 2์ฃผ์ฐจ dreamhack stage 12 - (1) (0) | 2022.04.08 |
[System Hacking] 2์ฃผ์ฐจ dreamhack stage 12 (0) | 2022.04.07 |
[System Hacking] 1์ฃผ์ฐจ dreamhack stage 11 - (2) (0) | 2022.04.07 |
[System Hacking] 1์ฃผ์ฐจ dreamhack stage 11 - (1) (0) | 2022.04.07 |