
5년차 프론트엔드 개발자
한어진 입니다.
단계적인 설계와 기술적 챌린지를 즐깁니다.
Frontend
Backend (Basic)
1. 목표 수립
2. 원인분석 및 문제 정의
원본 파일 데이터랑 많이 달라져 있다.
데이터 가공 로직 전체를 완전히 분석해야 한다.
버퍼 오버플로우 취약점인데,
쓰기 불가 영역과 만나서 현재로선 의미가 없다.
3. 세부목표 수립
취약점을 분석·활용해서 무기로 만든다.
1. 메모리를 덮어쓸 수 있도록 만든다.
2. 원하는 데이터로 가공할 수 있도록 한다.
3. 취약점을 이용해 임의의 코드를 실행시킨다.
4. 필요 자료 학습
에러 유발 변조 데이터 확인
WAV 파일구조 학습
상관관계 상세 이해
있어야 했던 검증로직
윈도우 힙 메모리 구조
프론트엔드 힙, 백엔드 힙, 메모리 청크 관리 방식
FreeList 관리, 단편화 문제(LFH), 단편화 문제 대응방식과 원리
윈도우 힙 메모리 구조
단편화와 LFH(Low Fragmentation Heap)
LFH 트리거 조건과, LFH 힙 구조
Windows OS의 LFH 관리방식
5. 장애물 극복
FFF00040
+ 00100000
-------------
1 00000040
Integer Overflow를 통해 작은 크기도 가능해요!
연속된 메모리가 존재하므로, 이제 덮어쓸 수 있어요!
너무 커서 가상메모리로 할당돼요.
뒤의 영역은 실제 메모리로 할당되지 않아서 쓰기 자체가 불가능해요.
그러면 크기를 작게 설정할 수 없나요?
0x100000가 고정적으로 더해져서 안돼요.
그러면 아예 크게 계산되도록 해서 초과시켜버리면요?
16bits 데이터를 읽은 후
4bytes로 변환시키는데요..?
원하는 대로 4bytes 전체를 채울 수 없어요.
다루는 파일이 16bit 기반 파일이라 그래요.
32bit 이상의 파일로 바꿔보면요?
원하는 대로 채울 수 있어요!
데이터 변환 로직이 또 있어요.
특정 주기마다 검사 후
데이터를 변조시키는데요..?
검사 주기마다 우회 값을 넣어주면요?
일부 영역을 사용할 수 없게 되지만
나머지 영역은 지킬 수 있어요!
마지막에 값의 범위를
검증하는 로직도 있어요
조건부 실행이 아니라서
우회방법이 없어요.
그러면 범위에 부합하는 값으로만 만들면 되지 않을까요?
가능해요!
다만 만들 수 없는 값들이 많이 생겨요.
제약들을 다 지킨다면
쉘코드를 원하는 대로 작성할 수 없어요.
꼭 처음부터 완벽히 완성되어야 하나요?
"cal#"
0x63 0x61 0x6c 0x23
"Win.xec"
0x57 0x69 0x63 0x05 0x78 0x65 0x63 0x00
"calc"
0x63 0x61 0x6c 0x63
"WinExec"
0x57 0x69 0x63 0x45 0x78 0x65 0x63 0x00
로직과 제약을 완벽하게 이해하고 있으니
방법은 만들면 돼요.
만들 수 없는 데이터는
실행되면서 완성되도록 만들어요.
LFH에선 같은 크기의 블럭들이 관리돼요.
목표 함수테이블보다 앞에 Freed Block이 있다면
버퍼 오버플로우 취약점 으로 덮어쓸 수 있어요.
이 가상 함수테이블를 참조하게 된다면
우리가 조작한 쉘코드를 실행하게 돼요.
데이터까진 억지로 만들더라도,
어떻게 실행시킬 건데요?
버퍼 오버플로우니까
무엇을 어떻게 덮어쓸 지 고민해요.
함수테이블이 힙에 할당돼요.
가상함수 테이블을 덮어써보면요?
윈도우 힙 메모리 관리 방식을 이해하고,
덮어쓸 수 있는 함수테이블을 찾아요.
근처에 작은 함수테이블을 찾았고,
LFH라는 게 켜져있어요.
6. 결과 도출
CVE-2018-16797
원격 코드 실행 취약점
위험도 7.8 HIGH
제어할 수 있는 요소가 거의 없고, 제약이 많아
모두가 안될 거라 했지만
6개월 간의 집념과 끈기로 프로젝트를 성공시켰습니다.
불가능에 도전합니다.