profile image

L o a d i n g . . .

1. 문제

보호 기법 확인

 

문제 바이너리 실행

 

 

main 함수

ida로 확인

 

 

add() 함수

- 0x28만큼 malloc() 할당한 후 변수 s에 반환된 포인터 저장

- 입력받은 size 만큼 malloc() 할당 후 변수 buf에 반환된 포인터 저장 

- (DWORD)s에 1을 저장하고, (QWORD)s+1에 buf 값을 저장하고 (char*)s +16에 문자열을 저장한다.(color)

- &flowerlist(전역변수) + size(HIDWORD)에 s 값을 저장하고 flowercount(전역변수) 값을 증가시킨다.

 

 

struct flower{
	int vaild ;
	char *name ;
	char color[24] ;
};

사실 flower 구조체를 위해 처음에 0x28만큼 malloc() 할당한 것이다.

flower->valid 에 1을 넣은 것

flower->name 에 buf 주소를 넣은 것

flower->color 에 문자열을 입력받은 것

그리고 flowerlist 는 flower 구조체 배열 정도로 생각하면 된다.

 

 

del() 함수

    - v1에 값을 입력받아 인덱스처럼 쓴다.

    - &flowerlist + v1에 0을 할당한다. 

    - (&flowerlist + v1)+8 바이트에 위치한 꽃 이름 영역을 해제한다.

     

     

    clean() 함수

    - del() 과 달리 모든 꽃의 이름 영역을 해제한다.

     

     

    visit() 함수

    - 모든 꽃의 이름과, 색깔을 출력해준다.

     

     

    magic() 함수

    flag 파일을 열어서 읽어주는 magic() 함수가 존재한다.

     


    2. 문제 해결 과정

    DFB(Double Free Bug) 를 이용한 Fastbin dup 를 통해 문제를 풀 수 있다.

    fastbin dup 취약점을 이용하면, 해제된 chunk 의 fd 를 조작해서 임의의 주소에 fake chunk 를 할당할 수 있다.

    그리고 만약 fack chunk를 할당한 후 입력이 가능하다면, 원하는 주소에 원하는 값을 쓸 수 있다는 말이 된다.

    -> 따라서 이 문제에서는 puts_got 주소에 magic() 함수 주소를 overwrite 해서 풀 것이다.

     

    구해야 할 것은 다음과 같다.

     

    1. puts_got 주소

    -> 0x602020

     

    2. magic() 함수 주소

    -> 0x400C7B

     

    3. fake chunk

    이 문제에서는 드림핵, 라젠카와는 달리 우리가 직접 fake chunk를 조작해서 만들 수 없다.

    -> puts_got 보다 낮은 주소에서 fake chunk를 찾아야 한다.

     

    fake chunk 주소 : 0x601ffa

    prev_size : 0x0, size : 0x60(96)

    size가 0x60(96) 이므로, 메모리 할당 시 메타 데이터 16을 제외한 80을 요청해야한다.

     

     

    공격 프로세스

    1. ptr1, ptr2 할당

    2. ptr1, ptr2, ptr1 순으로 해제

    3. ptr1 을 재할당하며, 입력 시 fake chunk 주소를 넣음

    4. 네번째 재할당 시 fake chunk 가 할당되기에, 이때 dummy*22+majic() 함수 주소를 넣음

    (fake chunk 주소(0x601ffa) 와 got 주소(0x602020) 의 offset이 38이므로, 메타데이터를 제외한 22를 더미값으로 준 뒤 majic() 함수 주소를 넣는 것.)

     

     


    3. 익스플로잇

     

    익스플로잇 코드

     

    플래그 획득!

    'Wargame > etc' 카테고리의 다른 글

    [HITCON training] lab 5 simplerop  (0) 2021.04.12
    [codegate quals 2018] - BaskinRobins31(basic x64)  (0) 2021.04.04
    [pliadCTF 2013] - ropasaurusrex(basic x86)  (0) 2021.04.03
    [HITCON training] lab4 ret2libc  (0) 2021.03.21
    복사했습니다!