Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
C
cwe_checker
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
fact-depend
cwe_checker
Commits
528749a5
Unverified
Commit
528749a5
authored
Jul 01, 2021
by
Melvin Klimke
Committed by
GitHub
Jul 01, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Mock objects with bytesize (#194)
parent
b571c3eb
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
94 additions
and
62 deletions
+94
-62
tests.rs
...checker_lib/src/analysis/pointer_inference/state/tests.rs
+17
-15
cwe_134.rs
src/cwe_checker_lib/src/checkers/cwe_134.rs
+1
-1
tests.rs
src/cwe_checker_lib/src/checkers/cwe_78/context/tests.rs
+17
-17
tests.rs
src/cwe_checker_lib/src/checkers/cwe_78/state/tests.rs
+12
-12
builder.rs
...lib/src/intermediate_representation/expression/builder.rs
+9
-3
term.rs
src/cwe_checker_lib/src/intermediate_representation/term.rs
+14
-14
binary.rs
src/cwe_checker_lib/src/utils/binary.rs
+24
-0
No files found.
src/cwe_checker_lib/src/analysis/pointer_inference/state/tests.rs
View file @
528749a5
...
@@ -486,15 +486,17 @@ fn specialize_by_expression_results() {
...
@@ -486,15 +486,17 @@ fn specialize_by_expression_results() {
// Expr = Var(RAX)
// Expr = Var(RAX)
let
mut
state
=
base_state
.clone
();
let
mut
state
=
base_state
.clone
();
let
x
=
state
let
x
=
state
.specialize_by_expression_result
(
&
Expression
::
var
(
"RAX"
),
Bitvector
::
from_i64
(
7
)
.into
());
.specialize_by_expression_result
(
&
Expression
::
var
(
"RAX"
,
8
),
Bitvector
::
from_i64
(
7
)
.into
());
assert
!
(
x
.is_ok
());
assert
!
(
x
.is_ok
());
assert_eq!
(
assert_eq!
(
state
.get_register
(
&
register
(
"RAX"
)),
state
.get_register
(
&
register
(
"RAX"
)),
Bitvector
::
from_i64
(
7
)
.into
()
Bitvector
::
from_i64
(
7
)
.into
()
);
);
let
mut
state
=
base_state
.clone
();
let
mut
state
=
base_state
.clone
();
let
x
=
state
let
x
=
state
.specialize_by_expression_result
(
.specialize_by_expression_result
(
&
Expression
::
var
(
"RAX"
),
Bitvector
::
from_i64
(
-
20
)
.into
());
&
Expression
::
var
(
"RAX"
,
8
),
Bitvector
::
from_i64
(
-
20
)
.into
(),
);
assert
!
(
x
.is_err
());
assert
!
(
x
.is_err
());
let
mut
state
=
base_state
.clone
();
let
mut
state
=
base_state
.clone
();
...
@@ -507,7 +509,7 @@ fn specialize_by_expression_results() {
...
@@ -507,7 +509,7 @@ fn specialize_by_expression_results() {
PointerDomain
::
new
(
abstract_id
.clone
(),
IntervalDomain
::
mock
(
0
,
50
))
.into
(),
PointerDomain
::
new
(
abstract_id
.clone
(),
IntervalDomain
::
mock
(
0
,
50
))
.into
(),
);
);
let
x
=
state
.specialize_by_expression_result
(
let
x
=
state
.specialize_by_expression_result
(
&
Expression
::
var
(
"RAX"
),
&
Expression
::
var
(
"RAX"
,
8
),
PointerDomain
::
new
(
abstract_id
.clone
(),
IntervalDomain
::
mock
(
20
,
70
))
.into
(),
PointerDomain
::
new
(
abstract_id
.clone
(),
IntervalDomain
::
mock
(
20
,
70
))
.into
(),
);
);
assert
!
(
x
.is_ok
());
assert
!
(
x
.is_ok
());
...
@@ -533,7 +535,7 @@ fn specialize_by_expression_results() {
...
@@ -533,7 +535,7 @@ fn specialize_by_expression_results() {
// Expr = -Var(RAX)
// Expr = -Var(RAX)
let
mut
state
=
base_state
.clone
();
let
mut
state
=
base_state
.clone
();
let
x
=
state
.specialize_by_expression_result
(
let
x
=
state
.specialize_by_expression_result
(
&
Expression
::
var
(
"RAX"
)
.un_op
(
UnOpType
::
Int2Comp
),
&
Expression
::
var
(
"RAX"
,
8
)
.un_op
(
UnOpType
::
Int2Comp
),
Bitvector
::
from_i64
(
-
7
)
.into
(),
Bitvector
::
from_i64
(
-
7
)
.into
(),
);
);
assert
!
(
x
.is_ok
());
assert
!
(
x
.is_ok
());
...
@@ -597,7 +599,7 @@ fn specialize_by_binop() {
...
@@ -597,7 +599,7 @@ fn specialize_by_binop() {
// Expr = RAX + Const
// Expr = RAX + Const
let
mut
state
=
base_state
.clone
();
let
mut
state
=
base_state
.clone
();
let
x
=
state
.specialize_by_expression_result
(
let
x
=
state
.specialize_by_expression_result
(
&
Expression
::
var
(
"RAX"
)
.plus_const
(
20
),
&
Expression
::
var
(
"RAX"
,
8
)
.plus_const
(
20
),
IntervalDomain
::
mock
(
5
,
7
)
.into
(),
IntervalDomain
::
mock
(
5
,
7
)
.into
(),
);
);
assert
!
(
x
.is_ok
());
assert
!
(
x
.is_ok
());
...
@@ -609,7 +611,7 @@ fn specialize_by_binop() {
...
@@ -609,7 +611,7 @@ fn specialize_by_binop() {
// Expr = RAX - Const
// Expr = RAX - Const
let
mut
state
=
base_state
.clone
();
let
mut
state
=
base_state
.clone
();
let
x
=
state
.specialize_by_expression_result
(
let
x
=
state
.specialize_by_expression_result
(
&
Expression
::
var
(
"RAX"
)
.minus_const
(
20
),
&
Expression
::
var
(
"RAX"
,
8
)
.minus_const
(
20
),
Bitvector
::
from_i64
(
5
)
.into
(),
Bitvector
::
from_i64
(
5
)
.into
(),
);
);
assert
!
(
x
.is_ok
());
assert
!
(
x
.is_ok
());
...
@@ -622,7 +624,7 @@ fn specialize_by_binop() {
...
@@ -622,7 +624,7 @@ fn specialize_by_binop() {
let
mut
state
=
base_state
.clone
();
let
mut
state
=
base_state
.clone
();
let
x
=
state
.specialize_by_expression_result
(
let
x
=
state
.specialize_by_expression_result
(
&
Expression
::
BinOp
{
&
Expression
::
BinOp
{
lhs
:
Box
::
new
(
Expression
::
var
(
"RAX"
)),
lhs
:
Box
::
new
(
Expression
::
var
(
"RAX"
,
8
)),
op
:
BinOpType
::
IntXOr
,
op
:
BinOpType
::
IntXOr
,
rhs
:
Box
::
new
(
Expression
::
const_from_i64
(
3
)),
rhs
:
Box
::
new
(
Expression
::
const_from_i64
(
3
)),
},
},
...
@@ -638,9 +640,9 @@ fn specialize_by_binop() {
...
@@ -638,9 +640,9 @@ fn specialize_by_binop() {
let
mut
state
=
base_state
.clone
();
let
mut
state
=
base_state
.clone
();
let
x
=
state
.specialize_by_expression_result
(
let
x
=
state
.specialize_by_expression_result
(
&
Expression
::
BinOp
{
&
Expression
::
BinOp
{
lhs
:
Box
::
new
(
Expression
::
var
(
"RAX"
)),
lhs
:
Box
::
new
(
Expression
::
var
(
"RAX"
,
8
)),
op
:
BinOpType
::
IntOr
,
op
:
BinOpType
::
IntOr
,
rhs
:
Box
::
new
(
Expression
::
var
(
"RBX"
)),
rhs
:
Box
::
new
(
Expression
::
var
(
"RBX"
,
8
)),
},
},
Bitvector
::
from_i64
(
0
)
.into
(),
Bitvector
::
from_i64
(
0
)
.into
(),
);
);
...
@@ -657,7 +659,7 @@ fn specialize_by_binop() {
...
@@ -657,7 +659,7 @@ fn specialize_by_binop() {
let
mut
state
=
base_state
.clone
();
let
mut
state
=
base_state
.clone
();
let
x
=
state
.specialize_by_expression_result
(
let
x
=
state
.specialize_by_expression_result
(
&
Expression
::
BinOp
{
&
Expression
::
BinOp
{
lhs
:
Box
::
new
(
Expression
::
var
(
"RAX"
)),
lhs
:
Box
::
new
(
Expression
::
var
(
"RAX"
,
8
)),
op
:
BinOpType
::
IntOr
,
op
:
BinOpType
::
IntOr
,
rhs
:
Box
::
new
(
Expression
::
const_from_i64
(
0
)),
rhs
:
Box
::
new
(
Expression
::
const_from_i64
(
0
)),
},
},
...
@@ -717,7 +719,7 @@ fn specialize_by_equality_comparison() {
...
@@ -717,7 +719,7 @@ fn specialize_by_equality_comparison() {
&
Expression
::
BinOp
{
&
Expression
::
BinOp
{
lhs
:
Box
::
new
(
Expression
::
const_from_i64
(
23
)),
lhs
:
Box
::
new
(
Expression
::
const_from_i64
(
23
)),
op
:
BinOpType
::
IntEqual
,
op
:
BinOpType
::
IntEqual
,
rhs
:
Box
::
new
(
Expression
::
var
(
"RAX"
)),
rhs
:
Box
::
new
(
Expression
::
var
(
"RAX"
,
8
)),
},
},
Bitvector
::
from_u8
(
1
)
.into
(),
Bitvector
::
from_u8
(
1
)
.into
(),
);
);
...
@@ -731,7 +733,7 @@ fn specialize_by_equality_comparison() {
...
@@ -731,7 +733,7 @@ fn specialize_by_equality_comparison() {
&
Expression
::
BinOp
{
&
Expression
::
BinOp
{
lhs
:
Box
::
new
(
Expression
::
const_from_i64
(
23
)),
lhs
:
Box
::
new
(
Expression
::
const_from_i64
(
23
)),
op
:
BinOpType
::
IntNotEqual
,
op
:
BinOpType
::
IntNotEqual
,
rhs
:
Box
::
new
(
Expression
::
var
(
"RAX"
)),
rhs
:
Box
::
new
(
Expression
::
var
(
"RAX"
,
8
)),
},
},
Bitvector
::
from_u8
(
0
)
.into
(),
Bitvector
::
from_u8
(
0
)
.into
(),
);
);
...
@@ -748,7 +750,7 @@ fn specialize_by_equality_comparison() {
...
@@ -748,7 +750,7 @@ fn specialize_by_equality_comparison() {
&
Expression
::
BinOp
{
&
Expression
::
BinOp
{
lhs
:
Box
::
new
(
Expression
::
const_from_i64
(
23
)),
lhs
:
Box
::
new
(
Expression
::
const_from_i64
(
23
)),
op
:
BinOpType
::
IntNotEqual
,
op
:
BinOpType
::
IntNotEqual
,
rhs
:
Box
::
new
(
Expression
::
var
(
"RAX"
)),
rhs
:
Box
::
new
(
Expression
::
var
(
"RAX"
,
8
)),
},
},
Bitvector
::
from_u8
(
1
)
.into
(),
Bitvector
::
from_u8
(
1
)
.into
(),
);
);
...
@@ -758,7 +760,7 @@ fn specialize_by_equality_comparison() {
...
@@ -758,7 +760,7 @@ fn specialize_by_equality_comparison() {
&
Expression
::
BinOp
{
&
Expression
::
BinOp
{
lhs
:
Box
::
new
(
Expression
::
const_from_i64
(
100
)),
lhs
:
Box
::
new
(
Expression
::
const_from_i64
(
100
)),
op
:
BinOpType
::
IntEqual
,
op
:
BinOpType
::
IntEqual
,
rhs
:
Box
::
new
(
Expression
::
var
(
"RAX"
)),
rhs
:
Box
::
new
(
Expression
::
var
(
"RAX"
,
8
)),
},
},
Bitvector
::
from_u8
(
0
)
.into
(),
Bitvector
::
from_u8
(
0
)
.into
(),
);
);
...
...
src/cwe_checker_lib/src/checkers/cwe_134.rs
View file @
528749a5
...
@@ -196,7 +196,7 @@ pub mod tests {
...
@@ -196,7 +196,7 @@ pub mod tests {
let
def1
=
Def
::
assign
(
let
def1
=
Def
::
assign
(
"def2"
,
"def2"
,
Variable
::
mock
(
"RDI"
,
8
as
u64
),
Variable
::
mock
(
"RDI"
,
8
as
u64
),
Expression
::
var
(
"RBP"
)
.plus_const
(
8
),
Expression
::
var
(
"RBP"
,
8
)
.plus_const
(
8
),
);
);
let
def2
=
Def
::
assign
(
let
def2
=
Def
::
assign
(
"def3"
,
"def3"
,
...
...
src/cwe_checker_lib/src/checkers/cwe_78/context/tests.rs
View file @
528749a5
...
@@ -20,8 +20,8 @@ impl ExternSymbol {
...
@@ -20,8 +20,8 @@ impl ExternSymbol {
addresses
:
vec!
[
"UNKNOWN"
.to_string
()],
addresses
:
vec!
[
"UNKNOWN"
.to_string
()],
name
:
"sprintf"
.to_string
(),
name
:
"sprintf"
.to_string
(),
calling_convention
:
Some
(
"__stdcall"
.to_string
()),
calling_convention
:
Some
(
"__stdcall"
.to_string
()),
parameters
:
vec!
[
Arg
::
mock_register
(
"RDI"
),
Arg
::
mock_register
(
"RSI"
)],
parameters
:
vec!
[
Arg
::
mock_register
(
"RDI"
,
8
),
Arg
::
mock_register
(
"RSI"
,
8
)],
return_values
:
vec!
[
Arg
::
mock_register
(
"RAX"
)],
return_values
:
vec!
[
Arg
::
mock_register
(
"RAX"
,
8
)],
no_return
:
false
,
no_return
:
false
,
has_var_args
:
true
,
has_var_args
:
true
,
}
}
...
@@ -33,8 +33,8 @@ impl ExternSymbol {
...
@@ -33,8 +33,8 @@ impl ExternSymbol {
addresses
:
vec!
[
"UNKNOWN"
.to_string
()],
addresses
:
vec!
[
"UNKNOWN"
.to_string
()],
name
:
"scanf"
.to_string
(),
name
:
"scanf"
.to_string
(),
calling_convention
:
Some
(
"__stdcall"
.to_string
()),
calling_convention
:
Some
(
"__stdcall"
.to_string
()),
parameters
:
vec!
[
Arg
::
mock_register
(
"RDI"
)],
parameters
:
vec!
[
Arg
::
mock_register
(
"RDI"
,
8
)],
return_values
:
vec!
[
Arg
::
mock_register
(
"RAX"
)],
return_values
:
vec!
[
Arg
::
mock_register
(
"RAX"
,
8
)],
no_return
:
false
,
no_return
:
false
,
has_var_args
:
true
,
has_var_args
:
true
,
}
}
...
@@ -46,8 +46,8 @@ impl ExternSymbol {
...
@@ -46,8 +46,8 @@ impl ExternSymbol {
addresses
:
vec!
[
"UNKNOWN"
.to_string
()],
addresses
:
vec!
[
"UNKNOWN"
.to_string
()],
name
:
"sscanf"
.to_string
(),
name
:
"sscanf"
.to_string
(),
calling_convention
:
Some
(
"__stdcall"
.to_string
()),
calling_convention
:
Some
(
"__stdcall"
.to_string
()),
parameters
:
vec!
[
Arg
::
mock_register
(
"RDI"
),
Arg
::
mock_register
(
"RSI"
)],
parameters
:
vec!
[
Arg
::
mock_register
(
"RDI"
,
8
),
Arg
::
mock_register
(
"RSI"
,
8
)],
return_values
:
vec!
[
Arg
::
mock_register
(
"RAX"
)],
return_values
:
vec!
[
Arg
::
mock_register
(
"RAX"
,
8
)],
no_return
:
false
,
no_return
:
false
,
has_var_args
:
true
,
has_var_args
:
true
,
}
}
...
@@ -80,12 +80,12 @@ impl Setup {
...
@@ -80,12 +80,12 @@ impl Setup {
let
def1
=
Def
::
assign
(
let
def1
=
Def
::
assign
(
"def1"
,
"def1"
,
Variable
::
mock
(
"RBP"
,
8
as
u64
),
Variable
::
mock
(
"RBP"
,
8
as
u64
),
Expression
::
var
(
"RSP"
),
Expression
::
var
(
"RSP"
,
8
),
);
);
let
def2
=
Def
::
assign
(
let
def2
=
Def
::
assign
(
"def2"
,
"def2"
,
Variable
::
mock
(
"RDI"
,
8
as
u64
),
Variable
::
mock
(
"RDI"
,
8
as
u64
),
Expression
::
var
(
"RBP"
)
.plus_const
(
-
8
),
Expression
::
var
(
"RBP"
,
8
)
.plus_const
(
-
8
),
);
);
let
def3
=
Def
::
assign
(
let
def3
=
Def
::
assign
(
"def3"
,
"def3"
,
...
@@ -348,12 +348,12 @@ fn getting_blk_start_node_if_last_def() {
...
@@ -348,12 +348,12 @@ fn getting_blk_start_node_if_last_def() {
let
def1
=
Def
::
assign
(
let
def1
=
Def
::
assign
(
"def1"
,
"def1"
,
Variable
::
mock
(
"RBP"
,
8
as
u64
),
Variable
::
mock
(
"RBP"
,
8
as
u64
),
Expression
::
var
(
"RSP"
),
Expression
::
var
(
"RSP"
,
8
),
);
);
let
def2
=
Def
::
assign
(
let
def2
=
Def
::
assign
(
"def2"
,
"def2"
,
Variable
::
mock
(
"RDI"
,
8
as
u64
),
Variable
::
mock
(
"RDI"
,
8
as
u64
),
Expression
::
var
(
"RBP"
)
.plus_const
(
-
8
),
Expression
::
var
(
"RBP"
,
8
)
.plus_const
(
-
8
),
);
);
let
def3
=
Def
::
assign
(
let
def3
=
Def
::
assign
(
...
@@ -507,17 +507,17 @@ fn handling_assign_and_load() {
...
@@ -507,17 +507,17 @@ fn handling_assign_and_load() {
let
mock_assign_register
=
Def
::
assign
(
let
mock_assign_register
=
Def
::
assign
(
"assign"
,
"assign"
,
Variable
::
mock
(
"R9"
,
8
as
u64
),
Variable
::
mock
(
"R9"
,
8
as
u64
),
Expression
::
var
(
"RDI"
),
Expression
::
var
(
"RDI"
,
8
),
);
);
let
mock_assign_stack
=
Def
::
assign
(
let
mock_assign_stack
=
Def
::
assign
(
"stack_assign"
,
"stack_assign"
,
Variable
::
mock
(
"R9"
,
8
as
u64
),
Variable
::
mock
(
"R9"
,
8
as
u64
),
Expression
::
var
(
"RSP"
),
Expression
::
var
(
"RSP"
,
8
),
);
);
let
mock_load
=
Def
::
load
(
let
mock_load
=
Def
::
load
(
"load"
,
"load"
,
Variable
::
mock
(
"R9"
,
8
as
u64
),
Variable
::
mock
(
"R9"
,
8
as
u64
),
Expression
::
var
(
"RDI"
),
Expression
::
var
(
"RDI"
,
8
),
);
);
let
mut
pi_map
:
HashMap
<
Tid
,
PointerInferenceState
>
=
HashMap
::
new
();
let
mut
pi_map
:
HashMap
<
Tid
,
PointerInferenceState
>
=
HashMap
::
new
();
...
@@ -590,19 +590,19 @@ fn updating_def() {
...
@@ -590,19 +590,19 @@ fn updating_def() {
let
mock_assign_register
=
Def
::
assign
(
let
mock_assign_register
=
Def
::
assign
(
"assign"
,
"assign"
,
Variable
::
mock
(
"R9"
,
8
as
u64
),
Variable
::
mock
(
"R9"
,
8
as
u64
),
Expression
::
var
(
"RDI"
),
Expression
::
var
(
"RDI"
,
8
),
);
);
let
mock_assign_stack
=
Def
::
assign
(
let
mock_assign_stack
=
Def
::
assign
(
"stack_assign"
,
"stack_assign"
,
Variable
::
mock
(
"R9"
,
8
as
u64
),
Variable
::
mock
(
"R9"
,
8
as
u64
),
Expression
::
var
(
"RSP"
),
Expression
::
var
(
"RSP"
,
8
),
);
);
let
mock_load
=
Def
::
load
(
let
mock_load
=
Def
::
load
(
"load"
,
"load"
,
Variable
::
mock
(
"R9"
,
8
as
u64
),
Variable
::
mock
(
"R9"
,
8
as
u64
),
Expression
::
var
(
"RDI"
),
Expression
::
var
(
"RDI"
,
8
),
);
);
let
mock_store
=
Def
::
store
(
"store"
,
Expression
::
var
(
"R9"
),
Expression
::
var
(
"RDI"
));
let
mock_store
=
Def
::
store
(
"store"
,
Expression
::
var
(
"R9"
,
8
),
Expression
::
var
(
"RDI"
,
8
));
let
mut
pi_map
:
HashMap
<
Tid
,
PointerInferenceState
>
=
HashMap
::
new
();
let
mut
pi_map
:
HashMap
<
Tid
,
PointerInferenceState
>
=
HashMap
::
new
();
let
stack_id
=
setup
.pi_state.stack_id
.clone
();
let
stack_id
=
setup
.pi_state.stack_id
.clone
();
...
...
src/cwe_checker_lib/src/checkers/cwe_78/state/tests.rs
View file @
528749a5
...
@@ -134,7 +134,7 @@ fn setting_expression_and_constants() {
...
@@ -134,7 +134,7 @@ fn setting_expression_and_constants() {
);
);
// Test Case 2: Variables
// Test Case 2: Variables
let
copy_var_expr
=
Expression
::
var
(
"RSI"
);
let
copy_var_expr
=
Expression
::
var
(
"RSI"
,
8
);
setup
setup
.state
.state
.set_register_taint
(
&
setup
.rdi
,
Taint
::
Tainted
(
setup
.rdi.size
));
.set_register_taint
(
&
setup
.rdi
,
Taint
::
Tainted
(
setup
.rdi.size
));
...
@@ -153,7 +153,7 @@ fn setting_expression_and_constants() {
...
@@ -153,7 +153,7 @@ fn setting_expression_and_constants() {
);
);
// Test Case 2.5: Stack Pointer Assignment
// Test Case 2.5: Stack Pointer Assignment
let
stack_expression
=
Expression
::
var
(
"RSP"
);
let
stack_expression
=
Expression
::
var
(
"RSP"
,
8
);
setup
setup
.state
.state
.set_register_taint
(
&
setup
.rdi
,
Taint
::
Tainted
(
setup
.rdi.size
));
.set_register_taint
(
&
setup
.rdi
,
Taint
::
Tainted
(
setup
.rdi.size
));
...
@@ -173,7 +173,7 @@ fn setting_expression_and_constants() {
...
@@ -173,7 +173,7 @@ fn setting_expression_and_constants() {
);
);
// Test Case 3: Bin Ops
// Test Case 3: Bin Ops
let
bin_op_expr
=
Expression
::
var
(
"RBP"
)
.plus_const
(
-
8
);
let
bin_op_expr
=
Expression
::
var
(
"RBP"
,
8
)
.plus_const
(
-
8
);
setup
setup
.state
.state
.set_register_taint
(
&
setup
.rdi
,
Taint
::
Tainted
(
setup
.rdi.size
));
.set_register_taint
(
&
setup
.rdi
,
Taint
::
Tainted
(
setup
.rdi.size
));
...
@@ -194,7 +194,7 @@ fn setting_expression_and_constants() {
...
@@ -194,7 +194,7 @@ fn setting_expression_and_constants() {
);
);
// Test Case 4: Any other Expression
// Test Case 4: Any other Expression
let
cast_expr
=
Expression
::
var
(
"RDI"
)
let
cast_expr
=
Expression
::
var
(
"RDI"
,
8
)
.subpiece
(
ByteSize
::
new
(
0
),
ByteSize
::
new
(
4
))
.subpiece
(
ByteSize
::
new
(
0
),
ByteSize
::
new
(
4
))
.cast
(
CastOpType
::
IntZExt
);
.cast
(
CastOpType
::
IntZExt
);
...
@@ -231,8 +231,8 @@ fn tainting_values_to_be_stored() {
...
@@ -231,8 +231,8 @@ fn tainting_values_to_be_stored() {
.save_taint_to_memory
(
&
setup
.base_eight_offset
,
Taint
::
Tainted
(
ByteSize
::
new
(
8
)));
.save_taint_to_memory
(
&
setup
.base_eight_offset
,
Taint
::
Tainted
(
ByteSize
::
new
(
8
)));
setup
.state
.taint_value_to_be_stored
(
setup
.state
.taint_value_to_be_stored
(
&
setup
.def_tid
,
&
setup
.def_tid
,
&
Expression
::
var
(
"RDI"
),
&
Expression
::
var
(
"RDI"
,
8
),
&
Expression
::
var
(
"RSI"
),
&
Expression
::
var
(
"RSI"
,
8
),
&
stack_pointer
,
&
stack_pointer
,
&
RuntimeMemoryImage
::
mock
(),
&
RuntimeMemoryImage
::
mock
(),
);
);
...
@@ -257,8 +257,8 @@ fn tainting_values_to_be_stored() {
...
@@ -257,8 +257,8 @@ fn tainting_values_to_be_stored() {
.set_pointer_inference_state_for_def
(
Some
(
setup
.pi_state
.clone
()),
&
setup
.def_tid
);
.set_pointer_inference_state_for_def
(
Some
(
setup
.pi_state
.clone
()),
&
setup
.def_tid
);
setup
.state
.taint_value_to_be_stored
(
setup
.state
.taint_value_to_be_stored
(
&
setup
.def_tid
,
&
setup
.def_tid
,
&
Expression
::
var
(
"RDI"
),
&
Expression
::
var
(
"RDI"
,
8
),
&
Expression
::
var
(
"RSI"
),
&
Expression
::
var
(
"RSI"
,
8
),
&
stack_pointer
,
&
stack_pointer
,
&
RuntimeMemoryImage
::
mock
(),
&
RuntimeMemoryImage
::
mock
(),
);
);
...
@@ -277,7 +277,7 @@ fn tainting_def_input_register() {
...
@@ -277,7 +277,7 @@ fn tainting_def_input_register() {
// Test Case 1: Variable input
// Test Case 1: Variable input
setup
.state
.taint_def_input_register
(
setup
.state
.taint_def_input_register
(
&
Expression
::
var
(
"RDI"
),
&
Expression
::
var
(
"RDI"
,
8
),
&
stack_pointer
,
&
stack_pointer
,
&
setup
.def_tid
,
&
setup
.def_tid
,
&
RuntimeMemoryImage
::
mock
(),
&
RuntimeMemoryImage
::
mock
(),
...
@@ -289,7 +289,7 @@ fn tainting_def_input_register() {
...
@@ -289,7 +289,7 @@ fn tainting_def_input_register() {
// Test Case 2: Stack Pointer input
// Test Case 2: Stack Pointer input
setup
.state
.taint_def_input_register
(
setup
.state
.taint_def_input_register
(
&
Expression
::
var
(
"RSP"
),
&
Expression
::
var
(
"RSP"
,
8
),
&
stack_pointer
,
&
stack_pointer
,
&
setup
.def_tid
,
&
setup
.def_tid
,
&
RuntimeMemoryImage
::
mock
(),
&
RuntimeMemoryImage
::
mock
(),
...
@@ -306,7 +306,7 @@ fn tainting_def_input_register() {
...
@@ -306,7 +306,7 @@ fn tainting_def_input_register() {
// Test Case 3: Bin Op Input
// Test Case 3: Bin Op Input
setup
.state
.taint_def_input_register
(
setup
.state
.taint_def_input_register
(
&
Expression
::
var
(
"RDI"
)
.plus_const
(
8
),
&
Expression
::
var
(
"RDI"
,
8
)
.plus_const
(
8
),
&
stack_pointer
,
&
stack_pointer
,
&
setup
.def_tid
,
&
setup
.def_tid
,
&
RuntimeMemoryImage
::
mock
(),
&
RuntimeMemoryImage
::
mock
(),
...
@@ -320,7 +320,7 @@ fn tainting_def_input_register() {
...
@@ -320,7 +320,7 @@ fn tainting_def_input_register() {
// Test Case 4: Cast Op Input
// Test Case 4: Cast Op Input
setup
.state
.taint_def_input_register
(
setup
.state
.taint_def_input_register
(
&
Expression
::
var
(
"RDI"
)
.cast
(
CastOpType
::
IntZExt
),
&
Expression
::
var
(
"RDI"
,
8
)
.cast
(
CastOpType
::
IntZExt
),
&
stack_pointer
,
&
stack_pointer
,
&
setup
.def_tid
,
&
setup
.def_tid
,
&
RuntimeMemoryImage
::
mock
(),
&
RuntimeMemoryImage
::
mock
(),
...
...
src/cwe_checker_lib/src/intermediate_representation/expression/builder.rs
View file @
528749a5
...
@@ -14,6 +14,12 @@ impl Expression {
...
@@ -14,6 +14,12 @@ impl Expression {
Expression
::
Const
(
Bitvector
::
from_i64
(
value
))
Expression
::
Const
(
Bitvector
::
from_i64
(
value
))
}
}
/// Shortcut for creating a constant expression from an i32 value
#[cfg(test)]
pub
fn
const_from_i32
(
value
:
i32
)
->
Expression
{
Expression
::
Const
(
Bitvector
::
from_i32
(
value
))
}
/// Shortcut for creating a constant expression from an apint value (e.g. copy of global address)
/// Shortcut for creating a constant expression from an apint value (e.g. copy of global address)
#[cfg(test)]
#[cfg(test)]
pub
fn
const_from_apint
(
value
:
ApInt
)
->
Expression
{
pub
fn
const_from_apint
(
value
:
ApInt
)
->
Expression
{
...
@@ -22,10 +28,10 @@ impl Expression {
...
@@ -22,10 +28,10 @@ impl Expression {
/// Shortcut for creating a variable expression
/// Shortcut for creating a variable expression
#[cfg(test)]
#[cfg(test)]
pub
fn
var
(
name
:
&
str
)
->
Expression
{
pub
fn
var
(
name
:
impl
ToString
,
size_in_bytes
:
impl
Into
<
ByteSize
>
)
->
Expression
{
Expression
::
Var
(
Variable
{
Expression
::
Var
(
Variable
{
name
:
name
.
into
(),
name
:
name
.
to_string
(),
size
:
ByteSize
::
new
(
8
),
size
:
size_in_bytes
.into
(
),
is_temp
:
false
,
is_temp
:
false
,
})
})
}
}
...
...
src/cwe_checker_lib/src/intermediate_representation/term.rs
View file @
528749a5
...
@@ -813,8 +813,8 @@ mod tests {
...
@@ -813,8 +813,8 @@ mod tests {
}
}
impl
Arg
{
impl
Arg
{
pub
fn
mock_register
(
name
:
impl
ToString
)
->
Arg
{
pub
fn
mock_register
(
name
:
impl
ToString
,
size_in_bytes
:
impl
Into
<
ByteSize
>
)
->
Arg
{
Arg
::
Register
(
Variable
::
mock
(
name
.to_string
(),
ByteSize
::
new
(
8
)
))
Arg
::
Register
(
Variable
::
mock
(
name
.to_string
(),
size_in_bytes
))
}
}
}
}
...
@@ -825,8 +825,8 @@ mod tests {
...
@@ -825,8 +825,8 @@ mod tests {
addresses
:
vec!
[
"UNKNOWN"
.to_string
()],
addresses
:
vec!
[
"UNKNOWN"
.to_string
()],
name
:
"mock_symbol"
.to_string
(),
name
:
"mock_symbol"
.to_string
(),
calling_convention
:
Some
(
"__stdcall"
.to_string
()),
calling_convention
:
Some
(
"__stdcall"
.to_string
()),
parameters
:
vec!
[
Arg
::
mock_register
(
"RDI"
)],
parameters
:
vec!
[
Arg
::
mock_register
(
"RDI"
,
8
)],
return_values
:
vec!
[
Arg
::
mock_register
(
"RAX"
)],
return_values
:
vec!
[
Arg
::
mock_register
(
"RAX"
,
8
)],
no_return
:
false
,
no_return
:
false
,
has_var_args
:
false
,
has_var_args
:
false
,
}
}
...
@@ -977,27 +977,27 @@ mod tests {
...
@@ -977,27 +977,27 @@ mod tests {
Def
::
assign
(
Def
::
assign
(
"tid_1"
,
"tid_1"
,
Variable
::
mock
(
"X"
,
8
),
Variable
::
mock
(
"X"
,
8
),
Expression
::
var
(
"Y"
)
.un_op
(
UnOpType
::
IntNegate
),
Expression
::
var
(
"Y"
,
8
)
.un_op
(
UnOpType
::
IntNegate
),
),
),
Def
::
assign
(
Def
::
assign
(
"tid_2"
,
"tid_2"
,
Variable
::
mock
(
"Y"
,
8
),
Variable
::
mock
(
"Y"
,
8
),
Expression
::
var
(
"X"
)
.plus
(
Expression
::
var
(
"Y"
)),
Expression
::
var
(
"X"
,
8
)
.plus
(
Expression
::
var
(
"Y"
,
8
)),
),
),
Def
::
assign
(
Def
::
assign
(
"tid_3"
,
"tid_3"
,
Variable
::
mock
(
"X"
,
8
),
Variable
::
mock
(
"X"
,
8
),
Expression
::
var
(
"X"
)
.un_op
(
UnOpType
::
IntNegate
),
Expression
::
var
(
"X"
,
8
)
.un_op
(
UnOpType
::
IntNegate
),
),
),
Def
::
assign
(
Def
::
assign
(
"tid_4"
,
"tid_4"
,
Variable
::
mock
(
"Y"
,
8
),
Variable
::
mock
(
"Y"
,
8
),
Expression
::
var
(
"Y"
)
.un_op
(
UnOpType
::
IntNegate
),
Expression
::
var
(
"Y"
,
8
)
.un_op
(
UnOpType
::
IntNegate
),
),
),
Def
::
assign
(
Def
::
assign
(
"tid_5"
,
"tid_5"
,
Variable
::
mock
(
"Y"
,
8
),
Variable
::
mock
(
"Y"
,
8
),
Expression
::
var
(
"X"
)
.plus
(
Expression
::
var
(
"Y"
)),
Expression
::
var
(
"X"
,
8
)
.plus
(
Expression
::
var
(
"Y"
,
8
)),
),
),
];
];
let
mut
block
=
Term
{
let
mut
block
=
Term
{
...
@@ -1014,24 +1014,24 @@ mod tests {
...
@@ -1014,24 +1014,24 @@ mod tests {
Def
::
assign
(
Def
::
assign
(
"tid_1"
,
"tid_1"
,
Variable
::
mock
(
"X"
,
8
),
Variable
::
mock
(
"X"
,
8
),
Expression
::
var
(
"Y"
)
.un_op
(
UnOpType
::
IntNegate
),
Expression
::
var
(
"Y"
,
8
)
.un_op
(
UnOpType
::
IntNegate
),
),
),
Def
::
assign
(
Def
::
assign
(
"tid_2"
,
"tid_2"
,
Variable
::
mock
(
"Y"
,
8
),
Variable
::
mock
(
"Y"
,
8
),
Expression
::
var
(
"Y"
)
Expression
::
var
(
"Y"
,
8
)
.un_op
(
UnOpType
::
IntNegate
)
.un_op
(
UnOpType
::
IntNegate
)
.plus
(
Expression
::
var
(
"Y"
)),
.plus
(
Expression
::
var
(
"Y"
,
8
)),
),
),
Def
::
assign
(
Def
::
assign
(
"tid_3"
,
"tid_3"
,
Variable
::
mock
(
"X"
,
8
),
Variable
::
mock
(
"X"
,
8
),
Expression
::
var
(
"X"
)
.un_op
(
UnOpType
::
IntNegate
),
Expression
::
var
(
"X"
,
8
)
.un_op
(
UnOpType
::
IntNegate
),
),
),
Def
::
assign
(
Def
::
assign
(
"tid_5"
,
"tid_5"
,
Variable
::
mock
(
"Y"
,
8
),
Variable
::
mock
(
"Y"
,
8
),
Expression
::
var
(
"X"
)
.plus
(
Expression
::
var
(
"Y"
)
.un_op
(
UnOpType
::
IntNegate
)),
Expression
::
var
(
"X"
,
8
)
.plus
(
Expression
::
var
(
"Y"
,
8
)
.un_op
(
UnOpType
::
IntNegate
)),
),
),
];
];
assert_eq!
(
block
.term.defs
,
result_defs
);
assert_eq!
(
block
.term.defs
,
result_defs
);
...
...
src/cwe_checker_lib/src/utils/binary.rs
View file @
528749a5
...
@@ -337,6 +337,30 @@ pub mod tests {
...
@@ -337,6 +337,30 @@ pub mod tests {
write_flag
:
false
,
write_flag
:
false
,
execute_flag
:
false
,
execute_flag
:
false
,
},
},
// Contains string: 'cat %s %s %s %s' starting at the first byte.
MemorySegment
{
bytes
:
[
0x63
,
0x61
,
0x74
,
0x20
,
0x25
,
0x73
,
0x20
,
0x25
,
0x73
,
0x20
,
0x25
,
0x73
,
0x20
,
0x25
,
0x73
,
0x00
,
]
.to_vec
(),
base_address
:
0x6000
,
read_flag
:
true
,
write_flag
:
false
,
execute_flag
:
false
,
},
// Contains string: 'str1 str2 str3 str4'
MemorySegment
{
bytes
:
[
0x73
,
0x74
,
0x72
,
0x31
,
0x20
,
0x73
,
0x74
,
0x72
,
0x32
,
0x20
,
0x73
,
0x74
,
0x72
,
0x33
,
0x20
,
0x73
,
0x74
,
0x72
,
0x34
,
0x00
,
]
.to_vec
(),
base_address
:
0x7000
,
read_flag
:
true
,
write_flag
:
false
,
execute_flag
:
false
,
},
],
],
is_little_endian
:
true
,
is_little_endian
:
true
,
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment