상세 컨텐츠

본문 제목

[HITCON 2016] SleepyHolder

SYSTEM HACKING/CTF, etc

by koharin 2020. 1. 8. 00:28

본문

728x90
반응형

 

Partial RELRO → GOT Overwrite 가능

 


1. keep secret : calloc
# small secret → fastChunk
buf = calloc(1, 0x28);
read(0, buf, 0x28);

# big secret → largeChunk
qword_6020c0 = calloc(1, 0xfa0);
read(0, qword_6020c0, 0xfa0);

# hug secret → largeChunk
qword_6020c8 = calloc(1, 0x61a80);
read(0, qword_6020c8, 0x61a80);

전역변수인 buf, qword_6020c0, qword_6020c8 에 할당된  heap 주소 저장
→ 할당한 메모리를 전역변수에서 관리하므로 UAF 사용 X

small secret 1
small secret 2
free small secret 1
big secret 1
free small secret 1

2. wipe secret  : free

# wipe small secret
free(buf)

# wipe big secret
free(qword_6020c0)

* 취약점 발생 *
메모리 해제 시 전역변수 초기화 X
(다시 할당 시 이전에 사용하던 값 사용 가능)
free 했는지 여부 체크 X → DFB 가능

3. renew secret → edit

# small secret
read(0, buf, 0x28);

# big secret
read(0, qword_6020c0, 0xfa0);

할당받은 size 만큼만 수정 가능 → heap overflow 불가능

#process

 

fastChunk 2개를 malloc해서 3번째 할당하는 largeChunk와 인접하지 않도록 만든다.

free1번째 fastChunklargeChunk와 인접하지 않은 경우 smallbin으로 fastChunk가 들어간다.

한번 더 free하는 경우 fastbin에 들어가서 fastbinsmallbin에 첫 번째 해제한 청크 주소가 적힌다.

그리고 fastChunk 2개를 할당하면 처음엔 fastbin에서, 두 번째에는 smallbin에서 할당해준다.


1. small secret malloc(fastChunk)
2. big secret malloc(largeChunk)
3. small secret free → fastChunk가 fastbin으로 들어간다.
- fastbin 할당과 해제 시 prev_inuse 비트 변화 X (prev_inuse = 1)
4. hug secret malloc(largeChunk)
5. small secret free → hug secret 할당하고 small secret 해제 시 small secret은 smallbin에 들어간다.
- smallbin 상태에서는 prev_inuse 비트 값 변한다.
6. small secret free → DFB 발생
- smallbin 상태에서 free 시 prev_inuse 비트 값이 0으로 변한다.

=> prev_inuse 비트 값이 0이므로 unsafe unlink 공격 사용 가능

7. 첫 번째 chunk에 fakeChunk 저장

prev_size(0)
size(0)
&전역변수 - 0x18
&전역변수 - 0x10

 

그 후 big secret free 시
공격 대상 주소가 small_secret인 0x6020d0일 경우, unsafe unlink 후 메모리는 small_secret – 0x18 주소(0x6020b8)에 할당된다. 전역변수로 흐름을 컨트롤 가능

 

8.  Leak libc addr
small secret 할당 시 free_got를 씀 →renew 로 puts plt 줘서 free의 got에 puts 함수 주소 적음
buf에 atoi plt 줌
small secret free → puts(atoi plt) 가 되서 atoi addr를 leak 할 수 있다.
 
free를 system 함수 주소로 덮고 (read해서..)
big secret으로 “/bin/sh”를 전달하고 wipesecret(2)를 하면 system(“/bin/sh”)가 실행되서 쉘이 실행된다.

 

#exploit code

 

 

728x90
반응형

'SYSTEM HACKING > CTF, etc' 카테고리의 다른 글

[HITCON-Training] lab14 : magicheap  (0) 2020.01.12
[Insomni'hack 2017] Wheel of Robots  (0) 2020.01.10
[HITCON-Training] craxme  (0) 2020.01.02
[HITCON-Training] crack  (0) 2020.01.02
[Codegate2018] BaskinRobins31  (0) 2020.01.01

관련글 더보기