[HackCTF] :pwn: uaf

두비니

·

2021. 3. 30. 23:54

 

 

봅시다

 

 

 

1. 문제 분석

 

먼저 add_note입니다. 밑에가 짤리긴 했는데 저정도만 봐도됨.

malloc은 총 2번 일어납니다. 

크기가 8인 notelist에 한번, 그리고 요청하는 크기의 v0[1]에 한번 더 일어나네요.

 

 

다음은 del_note입니다.

del_note에서는 해당 notelist[v1]과 v0를 free합니다. 순서정도는 기억해둡시다. (*(notelist[v1]+1)은 노트의 내용)

 

그리고 마지막으로 print_note

요청한 내용을 출력시켜줍니다.

눈여겨봐줄 부분은 notelist[v1]의 값을 주소로 가져와서 바로 실행시키는 것을 볼 수 있습니다. (이부분도 기억해줍시다.)

 

 

아참 magic함수도 있습니다. 당연히 이걸 출력시키는게 목적이겠죠?

 

 

 

2. 취약점 찾기

 

우선 Use After Free라는 것은 어림짐작해볼 수 있습니다.

한번 직접 heap에 할당되는 값을 보면서 어떤식으로 heap과 bin에 쌓이고 있는지 보면 될 것 같은데, 우선 print_note에서 정확하게 어떤 식으로 프린트를 시키는지 확인하기 위해서 함수를 불러오는 부분에 breakpoint를 두고, 확인해보았습니다.

 

 

단순히 aaaaaaaa를 값으로 집어넣은 뒤, free하지 않고 바로 값을 확인해보았습니다. print_note_content로 이어지는 값이 들어가있네요.

 

그럼 이번에는 이걸 free한 뒤에 값을 확인해보도록 하겠습니다.

 

 

 

보면 원래는 print_note_content로 이어지는 부분이 다음 free된 chunk인 0x0804c010으로 이어지는 것으로 볼 수 있습니다. 그러면 만약에 우리가 이 부분을 원하는 함수의 주소로 바꿀 수 있다면?

 

 

3. 시나리오 작성

 

아직 heap에 익숙치 않아서 그런가 힘드네용.. 우선 천천히 봅시다.

우선 각 크기가 8인 note를 할당한다고 합시다. 그러면 다음과 같이 heap에 할당이 되겠죠?

내용[2] >> 내용[1] (오타)

그럼 이 상태에서 두 note모두 free시킨다고 가정합시다. 그러면 가장 작은 단위의 bin인 fastbin에서는 다음과 같이 free된 chunk들이 들어오게 됩니다.

 

보면 note의 내용이 먼저 free되기 때문에 다음과 같이 쌓입니다.

그럼 이 문제에서 우리가 하고자 하는 바는 함수포인터[0]이나 함수포인터[1]의 chunk 안에 우리가 원하는 주소를 입력하는 것입니다.

 

그럼 함수 포인터[1]의 경우에는, 어떤 값을 요청하든 새로운 note의 함수 포인터로 들어가지기 때문에 값을 바꿀 수가 없습니다. 그럼 함수 포인터[0]은 바꿀 수 있을까요?

 

당연하죠. 크기를 fastbin에서보다 큰 사이즈를 주어 새로 할당되도록 하고, 또다시 사이즈가 8인 chunk를 할당시킨다면 함수포인터[0]이 할당될 수도 있지 않을까요?

 

글로만 쓰니깐 좀 어려운데,

정리하자면 다음과 같습니다.

 

1. 크기가 8인 0번, 1번 note를 생성(결과적으로 4개의 chunk생성)

2. 크기가 16인 2번 note를 생성(이 note의 함수 포인터는 fastbin에 있던 것으로 재활용)

3. 크기가 8인 3번 note를 생성

3.1 3번 note의 함수 포인터는 이전의 1번 note의 내용이 되고, 3번 note의 내용은 0번 note의 함수 포인터가 됩니다.

4. 3번 note의 내용으로 magic함수의 주소를 입력

5. 0번 note를 print, 결론적으로 magic함수 실행

 

ㄱㄱ이대로 익스 짜봅시다

 

 

 

뭔가 문제가 있는지 interactive모드에서 uaf를 해주어야 제대로 실행이 되더라구요. 아무튼 굳굳

'War Games > HackCTF' 카테고리의 다른 글

[HackCTF] :pwn: Unexploitable_1  (0) 2021.04.03
[HackCTF] :pwn: ROP  (0) 2021.04.01
[HackCTF] :pwn: pwning  (0) 2021.03.27
[HackCTF] :rev: static  (0) 2021.03.25
[HackCTF] :pwn: gift  (0) 2021.03.24