Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes handling of jmp terms in the flatten pass #1465

Merged
merged 46 commits into from
Apr 13, 2022
Merged
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
06ee098
Update LLVM backend to work with version 12
bmourad01 Oct 23, 2021
c3f1f26
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Nov 3, 2021
3b8b06c
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Nov 4, 2021
53677fc
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Nov 6, 2021
4695b07
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Nov 13, 2021
c6c89c1
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Nov 16, 2021
a1fb592
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Nov 19, 2021
fa3c6da
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Nov 20, 2021
d5dc07f
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Nov 25, 2021
896a34d
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Dec 1, 2021
3cce21b
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Dec 2, 2021
96874e4
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Dec 3, 2021
c25c801
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Dec 3, 2021
cf3352a
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Dec 8, 2021
9cc0b14
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Dec 8, 2021
5a38191
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Dec 9, 2021
542ba10
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Dec 9, 2021
14e4b38
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Jan 5, 2022
2e5ff40
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Jan 5, 2022
6c98118
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Jan 5, 2022
a57a83a
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Jan 6, 2022
7a0cd73
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Jan 7, 2022
5ecd709
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Jan 12, 2022
16938dc
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Jan 13, 2022
206cb80
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Jan 14, 2022
300f1a3
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Jan 21, 2022
d61f265
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Jan 25, 2022
2520090
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Jan 25, 2022
6e12b2b
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Jan 28, 2022
1016a79
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Jan 31, 2022
69deca5
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Feb 1, 2022
efbd9bb
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Feb 2, 2022
9d4b4b0
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Feb 5, 2022
ef3f030
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Feb 9, 2022
e7f3150
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Feb 16, 2022
df4bfe9
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Mar 4, 2022
817df10
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Mar 9, 2022
f3d8c10
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Mar 14, 2022
ca3b2b1
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Mar 16, 2022
c7a57cd
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Mar 21, 2022
e21eb17
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Mar 24, 2022
57ce29b
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Mar 29, 2022
f955891
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Mar 30, 2022
e071b13
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Mar 30, 2022
c631d0a
Merge branch 'BinaryAnalysisPlatform:master' into master
bmourad01 Apr 12, 2022
b9347fe
Fixes handling of `jmp term`s in the flatten pass
Apr 12, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 28 additions & 33 deletions lib/bap_sema/bap_sema_flatten.ml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ open Core_kernel
open Bap_types.Std
open Bap_ir


let get_direct_typ (e : exp) : Type.t = match e with
| Bil.Var v -> Var.typ v
| Bil.Unknown (_,t) -> t
Expand All @@ -21,9 +20,15 @@ class substituter (x : var) (x' : var) = object
Let (v, exp, body)
end

let flatten_exp (exp : exp) (blk : blk term) (before : tid) : exp * blk term =
let flatten_exp
?(before : tid option = None)
(exp : exp)
(blk : blk term) : exp * blk term =
let is_virtual = true in
let fresh = true in
let insert blk def = match before with
| None -> Term.append def_t blk def
| Some before -> Term.prepend def_t ~before blk def in
let rec aux (exp : exp) (blk : blk term) = match exp with
| Bil.Load (x, y, endian, s) ->
let x, blk = aux x blk in
Expand All @@ -32,8 +37,7 @@ let flatten_exp (exp : exp) (blk : blk term) (before : tid) : exp * blk term =
let var = Var.create ~is_virtual ~fresh "flt" vtype in
let e = Bil.Load (x, y, endian, s) in
let def = Ir_def.create var e in
Bil.Var var,
Term.prepend def_t ~before blk def
Bil.Var var, insert blk def
| Bil.Store (x, y, z, endian, s) ->
let x, blk = aux x blk in
let y, blk = aux y blk in
Expand All @@ -42,35 +46,30 @@ let flatten_exp (exp : exp) (blk : blk term) (before : tid) : exp * blk term =
let var = Var.create ~is_virtual ~fresh "flt" vtype in
let e = Bil.Store (x, y, z, endian, s) in
let def = Ir_def.create var e in
Bil.Var var,
Term.prepend def_t ~before blk def
Bil.Var var, insert blk def
| Bil.BinOp (b, x, y) ->
let x, blk = aux x blk in
let y, blk = aux y blk in
let vtype = get_direct_typ x in
let var = Var.create ~is_virtual ~fresh "flt" vtype in
let e = Bil.BinOp(b, x, y) in
let def = Ir_def.create var e in
Bil.Var var,
Term.prepend def_t ~before blk def
Bil.Var var, insert blk def
| Bil.UnOp (u, x) ->
let x, blk = aux x blk in
let vtype = get_direct_typ x in
let var = Var.create ~is_virtual ~fresh "flt" vtype in
let e = Bil.UnOp(u, x) in
let def = Ir_def.create var e in
Bil.Var var,
Term.prepend def_t ~before blk def
| Bil.Var _
| Bil.Int _ -> exp, blk
Bil.Var var, insert blk def
| Bil.Var _ | Bil.Int _ -> exp, blk
| Bil.Cast (c, n, x) ->
let x, blk = aux x blk in
let vtype = Type.Imm n in
let var = Var.create ~is_virtual ~fresh "flt" vtype in
let e = Bil.Cast (c, n, x) in
let def = Ir_def.create var e in
Bil.Var var,
Term.prepend def_t ~before blk def
Bil.Var var, insert blk def
| Bil.Let (v, x, y) ->
let x, blk = aux x blk in
let var, blk = match x with
Expand All @@ -79,7 +78,7 @@ let flatten_exp (exp : exp) (blk : blk term) (before : tid) : exp * blk term =
let vtype = Var.typ v in
let var = Var.create ~is_virtual ~fresh "flt" vtype in
let def = Ir_def.create var x in
var, Term.prepend def_t ~before blk def in
var, insert blk def in
let y = (new substituter v var)#map_exp y in
aux y blk
| Bil.Unknown (_, _) -> exp, blk
Expand All @@ -91,47 +90,43 @@ let flatten_exp (exp : exp) (blk : blk term) (before : tid) : exp * blk term =
let var = Var.create ~is_virtual ~fresh "flt" vtype in
let e = Bil.Ite (x, y, z) in
let def = Ir_def.create var e in
Bil.Var var,
Term.prepend def_t ~before blk def
Bil.Var var, insert blk def
| Bil.Extract (n, p, x) ->
let x, blk = aux x blk in
let vtype = get_direct_typ x in
let var = Var.create ~is_virtual ~fresh "flt" vtype in
let e = Bil.Extract (n, p, x) in
let def = Ir_def.create var e in
Bil.Var var,
Term.prepend def_t ~before blk def
Bil.Var var, insert blk def
| Bil.Concat (x, y) ->
let x, blk = aux x blk in
let y, blk = aux y blk in
let vtype = get_direct_typ x in
let var = Var.create ~is_virtual ~fresh "flt" vtype in
let e = Bil.Concat (x, y) in
let def = Ir_def.create var e in
Bil.Var var,
Term.prepend def_t ~before blk def in
Bil.Var var, insert blk def in
aux exp blk

let flatten_blk original_blk =
let rec flatten_elts (elts : Ir_blk.elt seq) (blk : blk term) =
let rec flatten_jmp (jmp : Ir_jmp.t) (expseq : exp seq) (blk : blk term) =
match Seq.next expseq with
| Some(hd, tl) ->
let exp, blk = flatten_exp hd blk (Term.tid jmp) in
| Some (hd, tl) ->
let exp, blk = flatten_exp hd blk in
Ir_jmp.substitute jmp hd exp |> Term.update jmp_t blk |>
flatten_jmp jmp tl
| None -> blk in

match Seq.next elts with
| Some (hd, tl) -> (match hd with
| `Def def ->
let exp, blk = flatten_exp (Ir_def.rhs def) blk (Term.tid def) in
Ir_def.with_rhs def exp |> Term.update def_t blk |>
flatten_elts tl
| `Jmp jmp -> flatten_jmp jmp (Ir_jmp.exps jmp) blk
| `Phi phi -> flatten_elts tl blk)
| None -> blk in

| None -> blk
| Some (hd, tl) -> match hd with
| `Def def ->
let before = Some (Term.tid def) in
let exp, blk = flatten_exp (Ir_def.rhs def) blk ~before in
Ir_def.with_rhs def exp |> Term.update def_t blk |>
flatten_elts tl
| `Jmp jmp -> flatten_jmp jmp (Ir_jmp.exps jmp) blk
| `Phi _phi -> flatten_elts tl blk in
flatten_elts (Ir_blk.elts original_blk) original_blk

let flatten_sub =
Expand Down