Timotej Kapus Cristian Cadar Imperial College London
1
Timotej Kapus Cristian Cadar Imperial College London 1 Symbolic - - PowerPoint PPT Presentation
Timotej Kapus Cristian Cadar Imperial College London 1 Symbolic Execution Program analysis technique Active research area Used in industry IntelliTest, SAGE Angr KLOVER 2 Why symbolic execution? No
1
2
3
4
5
6
int i; make_symbolic(i); int vector[10] = {1,2,3,4,5,6,7,8,9,10}; if(vector[i] > 8) printf("big element\n"); else printf("small element");
7
int i; make_symbolic(i); int vector[10] = {1,2,3,4,5,6,7,8,9,10}; if(vector[i] > 8) printf("big element\n"); else printf("small element");
8
int i; make_symbolic(i); int vector[10] = {1,2,3,4,5,6,7,8,9,10}; if(vector[i] > 8) printf("big element\n"); else printf("small element");
9
vector[i] > 8
int i; make_symbolic(i); int vector[10] = {1,2,3,4,5,6,7,8,9,10}; if(vector[i] > 8) printf("big element\n"); else printf("small element");
10
vector[i] > 8 printf("big element\n");
int i; make_symbolic(i); int vector[10] = {1,2,3,4,5,6,7,8,9,10}; if(vector[i] > 8) printf("big element\n"); else printf("small element");
11
vector[i] > 8 printf("big element\n"); printf("small element");
char i; make_symbolic(i); int vector[10] = {1,2,3,4,5,6,7,8,9,10}; if(vector[i] > 8) printf("big element\n"); else printf("small element");
12
printf("big element\n");
vector[i] > 8 printf("small element");
13
14
15
16
17
i = symbolic j = symbolic
18
i = symbolic j = symbolic
array matrix[3] = [0xdeedbeef 0xdeedbef0 0xdeedbef1]
19
i = symbolic j = symbolic
array matrix[3] = [0xdeedbeef 0xdeedbef0 0xdeedbef1]
array matrix_0[3] = [0 0 0] array matrix_1[3] = [0 0 42] array matrix_2[3] = [0 0 0]
20
i = symbolic j = symbolic
array matrix[3] = [0xdeedbeef 0xdeedbef0 0xdeedbef1]
array matrix_0[3] = [0 0 0] array matrix_1[3] = [0 0 42] array matrix_2[3] = [0 0 0]
21
i = symbolic j = symbolic
array matrix[3] = [0xdeedbeef 0xdeedbef0 0xdeedbef1]
array matrix_0[3] = [0 0 0] array matrix_1[3] = [0 0 42] array matrix_2[3] = [0 0 0]
22
i = symbolic j = symbolic
array matrix[3] = [0xdeedbeef 0xdeedbef0 0xdeedbef1]
array matrix_0[3] = [0 0 0] array matrix_1[3] = [0 0 42] array matrix_2[3] = [0 0 0]
23
i = symbolic j = symbolic
array matrix[3] = [0xdeedbeef 0xdeedbef0 0xdeedbef1]
array matrix_0[3] = [0 0 0] array matrix_1[3] = [0 0 42] array matrix_2[3] = [0 0 0]
24
25
i = 0 j = symbolic
26
i = 0 j = symbolic
array matrix_0[3] = [0 0 0]
27
i = 0 j = symbolic
array matrix_0[3] = [0 0 0]
28
i = 2 j = symbolic
array matrix_2[3] = [0 0 0]
29
30
i = 0 ∨ 1 ∨ 2 j = symbolic
31
i = 0 ∨ 1 ∨ 2 j = symbolic
32
array matrix_0[3] = [0 0 0] array matrix_1[3] = [0 0 42] array matrix_2[3] = [0 0 0]
i = 0 ∨ 1 ∨ 2 j = symbolic
33
array matrix_0[3] = [0 0 0] array matrix_1[3] = [0 0 42] array matrix_2[3] = [0 0 0]
34
i = symbolic j = symbolic
35
i = symbolic j = symbolic
36
array memory[12] = [ 3 6 9 42 0]
i = symbolic j = symbolic
37
array memory[12] = [ 3 6 9 42 0]
i = symbolic j = symbolic
38
array memory[12] = [ 3 6 9 42 0]
39
○ Each pointer only points to a single segment
40
41
42
43
44
45
i = symbolic j = symbolic
46
i = symbolic j = symbolic
47
array segment_0[3] = [0xdeedbef0 0xdeedbef3 0xdeedbef6] array segment_1[9] = [ 0 42 0 ]
array segment_0[3] = [0xdeedbef0 0xdeedbef3 0xdeedbef6] array segment_1[9] = [ 0 42 0 ]
i = symbolic j = symbolic
48
(Read (3*i + j) segment_1)
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
get_sign(x);
64
get_sign(x); r = -1;
65
get_sign(x); x >= 1 r = -1;
66
get_sign(x); x >= 1 x == 0 x < 1 r = -1;
67
get_sign(x); x >= 1 x == 0 x < 1 x ≠ 0 r = -1; return r;
68
get_sign(x); x >= 1 x == 0 x < 1 x = 0 x ≠ 0 r = -1; return r; r = 0;
69
get_sign(x); x >= 1 x == 0 x < 1 x = 0 x ≠ 0 r = -1; return r; r = 0; return r;
70
get_sign(x); x >= 1 x == 0 x ≥ 1 x < 1 x = 0 x ≠ 0 r = -1; r = 1; return r; r = 0; return r;
71
get_sign(x); x >= 1 x == 0 x == 0 x ≥ 1 x < 1 x = 0 x ≠ 0 r = -1; r = 1; return r; r = 0; return r;
72
get_sign(x); x >= 1 x == 0 x == 0 x ≥ 1 x < 1 x ≠ 0 x = 0 x ≠ 0 r = -1; r = 1; return r; return r; r = 0; return r;
73
get_sign(x); x >= 1 x == 0 x == 0 x ≥ 1 x < 1 x = 0 x ≠ 0 x = 0 x ≠ 0 r = -1; r = 1; return r; return r; r = 0; return r;