[HITCON training] lab 12 secretgarden
1. 문제
main 함수
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() 함수
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. 익스플로잇