HanJeouk의 개인공부 블로그

조건

1. free된 청크의 사이즈를 조작할 수 있어야 한다,


1. 청크 5개를 할당한다(p1, p2, p3, p4, p5) . line 27 ~ line 31

2. p4 청크를 free 시킨다. line 53

3. p2 청크의 사이즈를 p3 청크의 사이즈만큼 더한 값으로 설정한다. line 57 

#조작한 사이즈 = p1_size+p2_size = 0x1000 + 0x1000 = 0x2000

4. p2 청크를 free 시킨다. line 61 #0x2000짜리 청크를 free한게 된 셈이다.

5. 조작한 청크 사이즈(0x2000)만큼 다시 할당한다. line 65 #그렇게 되면 free 됐었던 p2 청크주소에 할당이 된다.

할당을 하면 할당한 청크안에 p3 청크가 있게 된다. 그래서 p3 청크의 값을 덮을 수 있다.

'Documents > how2heap' 카테고리의 다른 글

how2heap overlapping_chunks  (0) 2018.03.19
how2heap house of spirit  (0) 2018.03.03
how2heap house_of_lore  (0) 2018.03.02
how2heap house_of_force  (0) 2018.02.20
how2heap unsorted_bin_attack  (0) 2018.01.17


조건: 

1. free된 청크의 사이즈를 조작할 수 있어야 한다. 

2. small bin과 fastbin의 할당이 자유로워야 한다.


1. p1(0x100-8),p2(0x100-8),p3(0x80-8)을 할당한다. (line 22 ~ line 24)

2. p2를 free한다. (line 33)

3. evil_chunk_size(0x181)와 evil_region_size(0x180-8)를 선언한다. (line 42 ~ 43)

4. free된 p2의 사이즈를 evil_chunk_size(0x181)로 바꾼다. #0x111 에서 0x181로 바뀜.

5. evil_region_size(0x180-8)만큼 할당을 한다. #free된 p2의 사이즈가 0x181이기 때문에 p2의 주소에 할당이 될 것이다. 0x180만큼 할당하게 되면 사이즈가 크기 때문에 뒤에 있던 p3의 값도 덮을 수 있게 된다.

'Documents > how2heap' 카테고리의 다른 글

how2heap overlapping_chunks2  (0) 2018.03.19
how2heap house of spirit  (0) 2018.03.03
how2heap house_of_lore  (0) 2018.03.02
how2heap house_of_force  (0) 2018.02.20
how2heap unsorted_bin_attack  (0) 2018.01.17

링크 <- 출처[shellphish github]

조건

1. 스택에 fake_chunk를 만들 수 있어야 한다.

2. 만든 fake_chunk의 주소를 알아야 한다. 즉 스택주소를 알아야 한다.

3. 힙 포인터를 조작할 수 있어야 한다.


1. malloc를 해준다. (line 9) #malloc(1)을 하게되면 자동으로 fastbin의 최소 size로 할당이 된다.

2. 변수명이 a인 포인터 변수를 하나 선언한다. (line 12)

3. 스택에 fake_chunk 변수를 배열로 선언한다. (line 14) #이 기법은 fake_chunk와 그 청크의 next_size까지 필요하기 때문에 fake_chunk[10]을 사용해서 2개의 fake 청크의 값을 설정하는 것이다.

4. 첫 번째 fake 청크의 사이즈를 0x40으로 설정해준다. (line 20) #free() invalid size 필터링 부분을 우회하기 위해서다.

5. 두 번째 청크 사이즈를 0x1234로 설정한다. (line 24) #free(): invaild size 필터링 부분을 우회하기 위해서다.

6. 아까 선언한 포인터 변수 a에 첫 번째 fake_chunk의 데이터 영역의 주소 값을 넣는다. (line 28)

7. 그리고 a를 free한다. (line 31) #그렇게 되면 첫 번째 fake_chunk가 진짜 청크라고 인식을 해서 free가 되고 fastbin에 첫 번쨰 fake_chunk가 등록된다. 

8.  청크를 할당하고 그 청크의 주소를 보면 스택에 할당된 것을 알 수 있다. (line 34)

끗 

'Documents > how2heap' 카테고리의 다른 글

how2heap overlapping_chunks2  (0) 2018.03.19
how2heap overlapping_chunks  (0) 2018.03.19
how2heap house_of_lore  (0) 2018.03.02
how2heap house_of_force  (0) 2018.02.20
how2heap unsorted_bin_attack  (0) 2018.01.17

링크 <- 출처[shellphish github]

조건

1. 스택에 값을 넣을 수 있어야 한다.

2. small 과 large 청크의 할당이 자유로워야 한다.

3. free된 청크의 bk의 값을 조작할 수 있어야 한다.


1. 스택에 fake_chunk 2개를 만든다.(line 34,35)

2. victim이라는 small bin을 하나 할당한다 (line 42)

3. victim_chunk라는 변수를 만들어 청크의 헤더 부분(8 or 16)만큼 빼준 값을 넣는다. (line 46)

4. 첫 번째 fake_chunk의 헤더 부분을 0으로하고  fd에 victim_chunk를 넣는다.(line 54,55,56) #small bin corruption을 막기 위해서다. 현재청크의 bk를 bck라고 했을 때 bck의 fd가 현재청크가 아니면 small bin corruption이 뜬다.  

5. 첫 번째 fake_chunk의 bk 부분에 두 번째 fake_chunk 주소를 넣는다.(line 61)

6. 두 번째 fake_chunk의 fd 부분에 첫 번째 fake_chunk 주소를 넣는다.(line 62)

7. victim이 free가 됐을 때 탑 청크와 병합하지 않도록 하기 위해서 large 청크를 하나 만든다.(line 66)

8. victim을 free한다.(line 71)

9. large 청크를 할당한다.(line 80) #free가 되면 victim은 바로 small bin으로 들어가지 않고 unsorted bin으로 들어간다. 그래서 unsorted bin에서 small bin으로 옮기기 위해 다른 large 청크를 하나 만들어주는 것이다. 여기서 왜 굳이 large bin이여야 하는지를 알아야 한다. malloc.c 찾아보기

10. victim의 bk 영역에 첫 번째 fake_chunk의 주소를 넣는다. #small bin corruption을 막기 위해서 현재청크의 bk를 bck라고 했을 때 bck의 fd가 현재청크가 아니면 small bin corruption이 뜬다.

11. victim 사이즈와 같이 할당해준다 (line 98)

12. victim 사이즈와 같이 할당해준다 (line 102) #여기에 우리가 할당하려는 스택에 할당이 된다. 

13. 이제 line 102에서 할당한 주소 +40이 ret니까 그 곳을 jackpot으로 덮으면 카나리를 뛰어넘어서 값이 들어가기 때문에 stack smashing 도 무시할 수 있다.

'Documents > how2heap' 카테고리의 다른 글

how2heap overlapping_chunks  (0) 2018.03.19
how2heap house of spirit  (0) 2018.03.03
how2heap house_of_force  (0) 2018.02.20
how2heap unsorted_bin_attack  (0) 2018.01.17
how2heap poison_null_byte  (0) 2018.01.16

링크 <- 출처[shellphish github]

조건

1. 탑 청크의 사이즈를 조작할 수 있어야 한다.

2. 청크 사이즈를 원하는 만큼 설정할 수 있어야 한다.


1. 청크를 하나 할당한다.

2. 할당한 후에 GDB로 Heap 영역을 보면 top chunk 사이즈가 나온다. (house of force가 되려면 무조건 이 탑청크 사이즈를 조작할 수 있어야 한다.) 이 사이즈를 이제 -1로 변경한다 (-1은 hex로 가장 큰 값이 0xffffffff로 나온다.) 

 ####첫 번쨰 청크 할당 후에 존재하던 top_chunk의 위치에는 나중에 두 번째 청크가 위치하게 된다.####(밑에 사진확인)

top chunk주목 0x20ef1

미르띤;; 0x20ef1이 청크 사이즈로 바뀜 

3. 이제 내가 할당하고자 하는 주소에서 32bit에서는 0x8 64bit 에서는 0x10을 빼주고 탑 청크의 주소를 빼준다. (0x8 or 0x16을 빼는 이유는 청크의 헤더부분을 빼야하기 때문이고 탑 청크의 주소를 빼주는 이유는 위의 말처럼 나중에 두번째 청크를 할당하면 탑 청크가 있던 주소는 두번째 청크의 주소가 자리잡아서 세번째 청크와의 오프셋을 구해야하기 때문이다. )

&두번째 청크+ size +(0x8 or 0x10) = &세번째 청크 <- 그래서 두번째 청크주소를 할당한 다음에 그 뒤에 오는 세번째 청크가 내가 원하는 주소가 되는 원리 ,값이 바로 들어가기 위해 청크의 헤더부분(0x8 or 0x10) 만큼 뺀다.

4. 뺀 값을 구하면 그 주소를 사이즈로하는 청크를 만든다. 그러면 top chunk가 있던 주소로 할당이 되니까 아까 구한 값이 맞아 떨어지면서 다음에 할당될 떄는 원하는 주소로 할당이 될 것이다.

이 글은 공부한 게 갑자기 기억이 안나면 복습용으로 보는거라 처음 공부하는 사람이 이걸 본다면 꼭 다른 사람들이 GDB를 이용해서 정리해놓은 걸 봤으면 좋겠다.

왜냐하면 gdb로 보는 게 더 공부가 잘 된다. ㅎ 

#설명을 너무 못한다 ㅎㅋ;;


'Documents > how2heap' 카테고리의 다른 글

how2heap house of spirit  (0) 2018.03.03
how2heap house_of_lore  (0) 2018.03.02
how2heap unsorted_bin_attack  (0) 2018.01.17
how2heap poison_null_byte  (0) 2018.01.16
house_of_einherjar  (0) 2018.01.15

링크 [출처: shellphish]


1. p를 400 만큼 할당을 한다.

2. free 됐을 때 top chunk 와 병합하지 않게 사이즈가 500 다른 청크를 만들어준다.

3. p를 free한다.

4. free된 청크 p의 fd와 bk에는 p가 small bin이라 free가 됐을 때 unsorted bin에 관리가 돼서 main_arena+88의 주소가 있다. 그래서 bk를 스택에 있는 변수의 주소 -8(32bit) or 16(64bit) 를 해준다. 그러면 free가 이전 청크가 있다고 판단을 하여 다음에 malloc 를 하면 bk+ 8 or 16 에 해준다. 

5. 400만큼 할당을 하면 bk 가 변수 주소 - (8 or 16) 이기 때문에 할당됐을 때 변수의 주소로 할당이 된다. free된 chunk 를 bin 에서 제거하는 과정에서 bk+0x10에 fd를 넣기 때문에 할당을 하면 변수에 main_arena+88 값이 들어간다.

#-8과 -16은 32bit 와 64bit 기준으로 청크의 fd에 해당한다.

'Documents > how2heap' 카테고리의 다른 글

how2heap house_of_lore  (0) 2018.03.02
how2heap house_of_force  (0) 2018.02.20
how2heap poison_null_byte  (0) 2018.01.16
house_of_einherjar  (0) 2018.01.15
first_fit & unsafe unlink  (0) 2018.01.08

문서링크는 Poison_null_byte 

필요한 조건: 이미 할당된 청크 사이즈와 prev_size를 조작할 수 있어야 한다. 0x200만큼 할당이 가능해야 한다. off_by_one 취약점이 있어야 한다.

fastbin 할당이 자유로워야 한다.

1. a를 0x100, b를 0x200, c를 0x100으로 할당한다.

2. b의 사이즈를 0x211에서 0x200으로 바꾼다.

3. 그리고 b의 데이터 부분+ 0x200이 되는 주소에 0x200을 넣어준다. #chunksize(P) != prev_size (next_chunk(P))<-얘 때문에 청크의 data부분 - 0x10(청크의 헤더) + 0x210(b의 사이즈) = 다음 청크의 prev_size주소, 즉 다음 청크라고 구한 주소에 값을 넣어줘야함. 

4.  b를 free한다.

5. a에서 off_by_one을 이용해서 b의 사이즈를 덮는다. #0x211에서 0x200으로

6. c의 prev_size를 0x200으로 바꾼다.

7. b1(0x100)과 b2(0x80)을 할당한다. #b1을 할당하면 b가 있던 주소로 할당이 될 것이고, b2은 b1청크 바로 뒤에 있을 것이다.

8. 이제 b1과 c를 free한다. #이 과정에서 병합이 b1과 c가 병합된다. 0x200+0x100 = 0x300

9. 이제 0x300만큼 할당하면 b1의 주소에 할당이 될 것이고  b2의 값을 조작할 수 있다.


'Documents > how2heap' 카테고리의 다른 글

how2heap house_of_force  (0) 2018.02.20
how2heap unsorted_bin_attack  (0) 2018.01.17
house_of_einherjar  (0) 2018.01.15
first_fit & unsafe unlink  (0) 2018.01.08
fastbin_dup & fastbin_dup_into_stack  (0) 2018.01.03

도움이 많이 됐던 문서: Lazenca 님의 블로그

문서링크는 House_of_einherjar  [출처: shellphish]


청크 a(0x38),b(0xf8)를 할당한다.

스택(Bss 영역이나 Heap 영역의 주소를 안다면 그곳에 해도 된다.)에 fake chunk 를 만든다. 

(청크 구조: prev_size(0x100) | size(0x100) | fd(&fake_chunk) | bk(&fake_chunk)) 

(prev_size 를 0x100으로 하는 이유는 P->bk->size == P->prev_size  를 우회하기 위해서다.)

(size를 0x100으로 하는 이유는 size를 small bin으로 유지시키기 위함이다.)


이제 Overflow 를 이용해서 청크 b의 Header를 조작해야 한다.

b는 0xf8로 할당했을 때 gdb로 chunk 구조를 보면 사이즈가 0x101(Prev_size[4 byte] + size[4 byte] + prev_inuse[1 byte] + data[0xf8]) 이 된다. 

그렇게 된다면 overflow 로 header를 조작할 때 사이즈인 0x101 에서 prev_inuse 인 1만 빼주면 0x100으로 간단하게 조작할 수 있게 된다. 

size는 그렇게 해주고 prev_size를 조작하는 게 중요하다. 왜냐하면 병합할 때 prev_size를 기준으로 병합하기 때문이다.

Unlink를 할 때 &chunk - prev_size를 한 주소에서 병합이 된다. &b는 청크 b의 데이터영역의 주소다. 0x10을 빼는 이유는 헤더부분을 제외하기 위해서다. &b-0x10 = &b_address 라고 하겠다.

 prev_size는&b_address - &fake_chunk 를 해준다. (설명: 계산을 했을 때 &b_address - &fake_chunk = offset 라고 가정을 하고 이 offset을 prev_size라고 설정하고 나중에 b를 free하게 되면 &b_address -  offset 을 했을 때 &fake_chunk가 된다.

a-b = c 일 때 a-c = b와 같은 원리이다.)

그리고 offset을 fake_chunk의 size에 넣어준다. 그러면 size(P) == prev_size(next_chunk(P)) 부분을 우회하게 된다.

이제 다시 할당하면 스택에 할당이 된다.



'Documents > how2heap' 카테고리의 다른 글

how2heap house_of_force  (0) 2018.02.20
how2heap unsorted_bin_attack  (0) 2018.01.17
how2heap poison_null_byte  (0) 2018.01.16
first_fit & unsafe unlink  (0) 2018.01.08
fastbin_dup & fastbin_dup_into_stack  (0) 2018.01.03

#복습용

[원문]how2heap first fic.c -> Link 출처[shellphish how2heap first_fit.c]


문서를 보면 512 바이트를 malloc 했던 a를 free하고 512보다 작은 500정도로 c를 할당하면 a가 할당 되었던 주소에 할당이 된다.

(아마 같은 사이즈로 할당해도 될 것이다.)

그러면 c가 a의 주소에 있기 때문에 a는 c를 가리키게 된다. 


[원문]how2heap unsafe_unlink.c- > Link 출처[shellphish how2heap unsafe_unlink.c]


unlink 메크로를 이용한 공격기법이다.

청크의 헤더 부분을 조작할 수 있어야 하고(prev_inuse 조작)

fd와 bk를 조작할 수 있어야 한다.(fake chunk fd,bk)

32bit

fd + 12 = bk

bk + 8 = fd

64bit

fd + 24 = bk

bk + 16 = fd

를 하기 때문에 fake chunk fd 를 넣을 때는 32비트면 원하는 주소 - 12 64비트면 원하는 주소의 -24 를 해줘야 한다.

bk는 32비트면 원하는 주소 -8 64비트면 -16을 빼야 unlink시 필터링에 안 걸린다.

도움되는 문서들이 다 좋은 것들이라 딱히 추천할 게 없다.

'Documents > how2heap' 카테고리의 다른 글

how2heap house_of_force  (0) 2018.02.20
how2heap unsorted_bin_attack  (0) 2018.01.17
how2heap poison_null_byte  (0) 2018.01.16
house_of_einherjar  (0) 2018.01.15
fastbin_dup & fastbin_dup_into_stack  (0) 2018.01.03

포너블을 한다면 무조건 거처야 한다는 shellphish의 how2heap..

평소에 다른 걸 공부하면 전에 공부했던 걸 까먹어서 이것만 보면 바로 기억나게 만드는 용으로 만들 것이다.

그러니 입문보다는 복습이다.


fastbin_dup 코드는 여기서 보면 된다 -> Link    출처 [https://github.com/shellphish]

fastbin_dup_into_stack은 여기서 -> Link   출처 [https://github.com/shellphish]

fastbin_dup gdb로 까서 상세하게 설명이 되어있는 곳 -> Link  출처 [http://banjjak23.tistory.com/]


fastbin_dup : 청크 A 를 연속으로 2번 free 하는 것은 필터링에 걸리기 때문에 이를 우회하기 위해

A를 한 번 free 하고 다른 청크 B를 free하면 다시 A청크를 free 할 수 있게되는 것이다.


fastbin_dup_into_stack :  fastbin 청크가 A,B,C 이렇게 4개가 주어진 상황이라고 가정한다. (gdb 로 shellphish 코드를 까본다면

8만 할당을 할텐데 fastbin 은 최소가 32만큼 할당이 돼서 청크 사이즈를 보면 0x21이라고 뜰 것이다. 

32 + 1(prev_inuse) = 33 = 0x20 + 0x1 = 0x21) 그리고 fastbin_dup를 이용해서 A B A 순으로 free를 한다.

다음에 malloc를 할 때 순서가 A B A로 될 것이다. AB 를 재할당하면 A만 남게 된다.

이제 A에 *d = (unsigned long long) (((char*)&stack_var) - sizeof(d)) 넣어준다.

(청크의 데이터 구조가 prev_size size data 이렇게 되어있으면 이 data 에서 fd bk 가 만들어진다. 그러니까 이 데이터를 fd 로 인식하게 시키는 것이다.

그러면 이 청크의 fd가 내가 넣어준 *d = (unsigned long long) (((char*)&stack_var) - sizeof(d))

로 될 것이다.)

그리고 이제 다시 할당을 하면 에 할당이 될 것이다. 근데 이  데이터를 보면 fd 영역에 *d = (unsigned long long) (((char*)&stack_var) - sizeof(d)) 이 들어있을 것이다. 그래서 다음에 malloc 를 하면 fd가

스택 주소니까 스택 주소에 할당되는 것이다.

끝!

'Documents > how2heap' 카테고리의 다른 글

how2heap house_of_force  (0) 2018.02.20
how2heap unsorted_bin_attack  (0) 2018.01.17
how2heap poison_null_byte  (0) 2018.01.16
house_of_einherjar  (0) 2018.01.15
first_fit & unsafe unlink  (0) 2018.01.08