본문 바로가기
비오비

8/3[이종호]

by sonysame 2019. 8. 3.

브라우저 익스플로잇


v8 javascript engine

*ccf oob



browser exploit은 어렵다?!?


많은 문서와 공개된 exploit=> exploit process가 어느정도 정해져 있다


*CTF

다운=>path


V8 Javascript Engine: google chrome에서 사용하고 있는 javascript engine

C++


a=0

if(a<3){

a=a+2;

}


AST(Abstract Syntax Tree)
->

Ignition(V8의 내부 컴파일러)

-> 바이트코드


사진 ./d8 --print-ast ./test.js =>AST 확인가능


Turbofan: V8의 컴파일러

Hot Function


Ignition=>Hot function(ByteCode)여러번 실행되는 부분=>Turbofan=>Optimized machine code


이제 엄청 빨라진다.


Ignition/Turbofan


Hidden Class

javascript에는 classs가 없다

생성된 객체의 속성은 동적으로 변경될 수 있다.


javascriprt에는 class가 없다.-> 해결책: Hidden Class


Hidden Class는 각 속성의 위치를 갖고 있고, object는 하나의 Hidden Class를 참조하고 있다.


Hidden Class 속성이 추가되거나 삭제된면 새로운 Hidden Class가 생성됨

이전 속성을 유지한채 새로운 속성에 대한 정보를 추가함

이전 Class는 새로운 Class에 대한 정보를 가지고 있다.


o1.z=3;

%DebugPrint(o1)



var a2={x:3, y:4}

%debugPrint(o2)


o1의 주소 map의 주소

Hidden Class는 Inline Cache에서 유용하게 사용됨

foo(O)->foo(O): Hidden Class가 바뀌었는지 아니었는지만 체크하고 Inline Cache에서 유용하게 사용됨


V8이 내부적으로 object의property를 처리할 때 속도를 위해 여러가지 방법을 사용함

property처리하는 방식: Named property vs Array-indexed property

Name property = key: value형태

Array-indexed property key가 1,2,3 ...인 property ->element의 type을 map이 가지고 있음

var o1={x:'hi, y:'bye'}

var o2=['a', 'b']


Array Indexed property


packed elements:[1,2,3,4]

holey elements:[1,,,4] 값이 중간에 비어있는 경우

[1,2,undefined,4,undefined]


Hidden Class가 오프셋을 가지고 있으므로 

the_hole의 경우 Hidden Class에 저장되지 않는다.(holey elements에서 비어있는 부분)


fast elements [1,2,3,4]

dictionary elements var arr=[], arr[1111]=1

1111크기만큼에 메모리를 할당하고 값을 넣는건 메모리 낭비가 심하다

arr[1111]=1만 저장된다 => 성능 향상


smi element: small integer(x64기준 2^31~2^31+1)

double element: floating point number와 smi가 아닌 integer





var a= [];

a.oob();

a.oob(1):

0 1 2 3 4 5 6 

1 2 3 4 5 6 7

7로 접근을 하면 out-of-bounds 취약점


map property element length


elements를 들어가서 보면

map length


tagged pointer


SMI: [32 bit signed int] [31 bits unused=0]

HeapObject: [64bit direct pointer] | 01


다른 elements의 map으로 보임: 이 부분이 릭이된다.


elements다음에 있는 object의 map 주소를 읽거나 쓸 수 있게 되었다.


<exploit primitives>: java script의 익스플로잇 키 포인트

1.원하는 javascript 객체 주소를 읽을 수 있어야 한다.

2.원하는 객체를 엔진에 삽입할 수 있어야 한다.


map을 이용한 type confusion

double array <-> array(object를 포함한)

원하는 객체 주소를 double형태로 얻을 수 있음(obj->double): 메모리 릭

원하는 주소를 object로 삽입할 수 있다.(double->obj): 원하는 오브젝트를 엔진에 넣는다.


map을 이용한 type confustion


garbage collector를 강제로 호출할 수 있다. 



element가 array보다 먼저 할당??


1. fake double array를 만들어서 arbitrary read/write를 얻음

-array elements가 array 바로 이전에 할당되는 것을 이용하여 원하는 값을 메모리에 써줌

2. wasm을 통해 rwx메모리를 만들고 그 주소를 leak함(aar)

wasm을 이용해 함수를 만들때 rwx 메모리가 생성된다는 점을 이용
3. ArrayBuffer의 backing store pointer를 rwx메모리로 덮어씀(aaw)

-ArrayBuffer의 backing store pointer를 덮으면 내부적으로 참조하는 buffer의 주소를 바꿀 수 있음

4. DataView를 통해 rwx메모리에 shellcode를 씀

5. wasm함수를 실행해서 shell 획득



array_buffer

fake_addr

raw


http://lordofpwn.kr/bob-8gi

'비오비' 카테고리의 다른 글

8/4[김재기멘토님]  (0) 2019.08.04
8/4 [박세준 멘토님]  (0) 2019.08.04
8/1  (0) 2019.08.01
8/1[신정훈멘토님]  (0) 2019.08.01
7/31 [이종호멘토님]  (0) 2019.07.31