Security Study/System

Use After Free

๐“›๐“พ๐“ฌ๐“ฎ๐“ฝ๐“ฎ_๐“ข๐“ฝ๐“ฎ๐“ต๐“ต๐“ช 2015. 10. 12.
728x90
๋ฐ˜์‘ํ˜•

use after free ๋ผ๋Š” ์ทจ์•ฝ์ ์€ ํ”„๋กœ๊ทธ๋žจ ๋ฉ”๋ชจ๋ฆฌ๋Š” ํฌ๊ฒŒ Code/Data/Heap/Stack์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”๋ฐ Code+Data=Binary์˜์—ญ Heap=ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋™์  ํ• ๋‹น/ํšŒ์ˆ˜/์ œ์–ด ํ•  ์ˆ˜ ์žˆ๋Š” ์˜์—ญ Stack=ํ•จ์ˆ˜ ๊ฐœ๋ณ„๊ณต๊ฐ„(์Šคํƒํ”„๋ ˆ์ž„),์ธ์ž์ „๋‹ฌ๋“ฑ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์˜์—ญ ์ด๋ ‡๊ฒŒ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค ์ด ์ค‘์—์„œ UAF๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํž™ ์˜์—ญ์„ ์ž˜๋ชป ๋‹ค๋ค˜์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ทจ์•ฝ์ ์ด๋‹ค.


์•„๋ž˜์˜ ์†Œ์Šค๋ฅผ ๋ณด์ž


#include <stdio.h>

#include <stdlib.h>


typedef struct UAF

{

int number;

}uaf;


int main(void)

{

uaf *one;

uaf *two;


one = malloc(100);

printf("one->number:%d\n",one->number);


one->number=12345;

printf("one->numver:%d\n",one->number);


free(one);

two=malloc(100);


printf("two->number:%d\n",two->number);

}


์†Œ์Šค๋ฅผ ์‹คํ–‰ํ•˜๋ฉด



์ด๋Ÿฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ์ˆ˜ ์žˆ๋‹ค. ๊ณผ์—ฐ ์ด๋ ‡๊ฒŒ ๋˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ? ์šฐ๋ฆฌ๋Š” free๋ฅผ ์ด์šฉํ•ด์„œ ํž™ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์ œ๊ฑฐํ•ด์„œ one ์ดํ›„ two์—๋Š” ๊ฐ’์ด ์—†์„ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ free๋ฅผ ์ด์šฉํ•ด์„œ ํž™ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค๊ณ  ํ•ด๋„ ๊ฐ’์€ ์ง€์›Œ์ง€์ง€ ์•Š๊ณ  ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ two ๋˜ํ•œ 12345๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.



๊ณผ์—ฐ ์ฃผ์†Œ๊ฐ’์„ ๋ณด๋ฉด ์–ด๋–จ๊นŒ?


์œ„์—์„œ ๋ณผ์ˆ˜ ์žˆ๋“ฏ ๊ฐ™์€ ์ฃผ์†Œ๊ฐ’์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ทจ์•ฝ์ ์„ use after free ์ทจ์•ฝ์ ์ด๋‹ค.


[์ฐธ๊ณ ]http://cd80.tistory.com/40

728x90
๋ฐ˜์‘ํ˜•

'Security Study > System' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

integer overflow  (0) 2015.10.22
system 24byte shellcode  (0) 2015.10.15
memory ์˜์—ญ  (0) 2015.10.07
C์–ธ์–ด์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ  (0) 2015.09.21
race condition(๊ฒฝ์Ÿ ์กฐ๊ฑด)attack  (0) 2015.09.17

๋Œ“๊ธ€