5년차 프론트엔드 개발자

한어진 입니다.

단계적인 설계와 기술적 챌린지를 즐깁니다.

Frontend

React, RN
TypeScript
Next.js
Tanstack Query
GraphQL
Recoil, Jotai

Backend (Basic)

Node.js
Nest.js
Hello
NNeexxtt..jjssNotionNotionCCMMSS((nnoottiioonn))..11ssttaattiiccppaaggee228811SSSSGG,,oonn--ddeemmaannddIISSRR..
nextjs output containing 282 pages of SSG and static page

Page preview
Page preview
Page preview
Page preview
??
CCoonntteexxttSSwwiittcchhiinngg..
..
..
Slack message
Slack message
Slack message
Slack message
Slack message
Slack message
Slack message
Slack message

문제 해결

1. 목표 수립

media player image
  • - 무기화 가능한 에러인지 분석하고,
  • - 가능하다면 증명하자
wav file image
error pop-up image

2. 원인분석 및 문제 정의

Buffer overflow step 1
Buffer overflow step 2
Buffer overflow step 3
Buffer overflow step 4
Buffer overflow step 5
Buffer overflow step 6
Buffer overflow step 7
Buffer overflow step 8
Buffer overflow step 9

원본 파일 데이터랑 많이 달라져 있다.
데이터 가공 로직 전체를 완전히 분석해야 한다.

Buffer overflow step 10

버퍼 오버플로우 취약점인데,
쓰기 불가 영역과 만나서 현재로선 의미가 없다.

reversing trace 1
reversing trace 2
reversing trace 3

3. 세부목표 수립

problem

취약점을 분석·활용해서 무기로 만든다.

block1

1. 메모리를 덮어쓸 수 있도록 만든다.

block2

2. 원하는 데이터로 가공할 수 있도록 한다.

block3

3. 취약점을 이용해 임의의 코드를 실행시킨다.

4. 필요 자료 학습

Wav File Format

mutated header

에러 유발 변조 데이터 확인

detailed wav header structure

WAV 파일구조 학습

header structure

상관관계 상세 이해

formula

있어야 했던 검증로직

memory management background

Windows OS 힙 메모리 관리기법

frontend heap
  • 프론트엔드 힙
  • 백엔드 힙
  • 메모리 청크 관리 방식
  • FreeList 관리
  • 단편화 문제(LFH)
  • 단편화 문제 대응방식과 원리
frontend heap

윈도우 힙 메모리 구조

frontend heap

단편화와 LFH(Low Fragmentation Heap)

frontend heap

LFH 트리거 조건과, LFH 힙 구조

frontend heap

Windows OS의 LFH 관리방식

5. 장애물 극복

FFF00040

+ 00100000

-------------

1 00000040

Integer Overflow를 통해 작은 크기도 가능해요!

adjacentHeapSegment

연속된 메모리가 존재하므로, 이제 덮어쓸 수 있어요!

너무 커서 가상메모리로 할당돼요.

뒤의 영역은 실제 메모리로 할당되지 않아서 쓰기 자체가 불가능해요.

그러면 크기를 작게 설정할 수 없나요?

1. 덮어 쓸 수가 없어요.

0x100000가 고정적으로 더해져서 안돼요.

그러면 아예 크게 계산되도록 해서 초과시켜버리면요?

16bits 데이터를 읽은 후
4bytes로 변환시키는데요..?

원하는 대로 4bytes 전체를 채울 수 없어요.

다루는 파일이 16bit 기반 파일이라 그래요.
32bit 이상의 파일로 바꿔보면요?

2. 원하는 데이터로 가공할 수 없어요.

원하는 대로 채울 수 있어요!

data after first mutation

데이터 변환 로직이 또 있어요.

특정 주기마다 검사 후
데이터를 변조시키는데요..?

검사 주기마다 우회 값을 넣어주면요?

2. 원하는 데이터로 가공할 수 없어요.

일부 영역을 사용할 수 없게 되지만
나머지 영역은 지킬 수 있어요!

data after second mutation

마지막에 값의 범위를
검증하는 로직도 있어요

조건부 실행이 아니라서
우회방법이 없어요.

그러면 범위에 부합하는 값으로만 만들면 되지 않을까요?

2. 원하는 데이터로 가공할 수 없어요.

가능해요!
다만 만들 수 없는 값들이 많이 생겨요.

constrains to pass the check

제약들을 다 지킨다면
쉘코드를 원하는 대로 작성할 수 없어요.

꼭 처음부터 완벽히 완성되어야 하나요?

"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

로직과 제약을 완벽하게 이해하고 있으니
방법은 만들면 돼요.

만들 수 없는 데이터는
실행되면서 완성되도록 만들어요.

adjacentHeapSegment

LFH에선 같은 크기의 블럭들이 관리돼요.

목표 함수테이블보다 앞에 Freed Block이 있다면
버퍼 오버플로우 취약점 으로 덮어쓸 수 있어요.

adjacentHeapSegment

가상 함수테이블를 참조하게 된다면

우리가 조작한 쉘코드를 실행하게 돼요.

데이터까진 억지로 만들더라도,
어떻게 실행시킬 건데요?

버퍼 오버플로우니까
무엇을 어떻게 덮어쓸 지 고민해요.

함수테이블이 힙에 할당돼요.
가상함수 테이블을 덮어써보면요?

3. 만든 쉘코드를 실행시킬 수 없어요.

윈도우 힙 메모리 관리 방식을 이해하고,
덮어쓸 수 있는 함수테이블을 찾아요.

근처에 작은 함수테이블을 찾았고,
LFH라는 게 켜져있어요.

6. 결과 도출

media player image
wav file image
error pop-up image
petya ransomware image

CVE-2018-16797

원격 코드 실행 취약점

위험도 7.8 HIGH

제어할 수 있는 요소가 거의 없고, 제약이 많아
모두가 안될 거라 했지만
6개월 간의 집념과 끈기로 프로젝트를 성공시켰습니다.

불가능에 도전합니다.