module Conventions where
import Base
import qualified Data.Map as M
import Debug.Trace
import Data.X86.Register
is_exiting_function_call :: [Char] -> Bool
is_exiting_function_call [Char]
f =
let f' :: [Char]
f' = [Char] -> [Char]
strip_GLIBC [Char]
f in
[Char]
f' [Char] -> [[Char]] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [
[Char]
"exit", [Char]
"_exit", [Char]
"__exit", [Char]
"___exit",
[Char]
"_error",[Char]
"__error",
[Char]
"__stack_chk_fail", [Char]
"___stack_chk_fail",
[Char]
"abort", [Char]
"_abort",
[Char]
"_fail",
[Char]
"halt",
[Char]
"_assert_fail", [Char]
"__assert_fail", [Char]
"___assert_fail", [Char]
"___assert_rtn",
[Char]
"err", [Char]
"verr", [Char]
"errc", [Char]
"verrc", [Char]
"errx", [Char]
"verrx",
[Char]
"_err", [Char]
"_verr", [Char]
"_errc", [Char]
"_verrc", [Char]
"_errx", [Char]
"_verrx",
[Char]
"obstack_alloc_failed_handler", [Char]
"isc_assertion_failed", [Char]
"isc_error_fatal",
[Char]
"PyExc_SystemExit", [Char]
"pthread_exit", [Char]
"error_exit",
[Char]
"__longjmp_chk"
]
strip_GLIBC :: [Char] -> [Char]
strip_GLIBC = [Char] -> [Char] -> [Char]
takeUntilString [Char]
"@GLIBC" ([Char] -> [Char]) -> ([Char] -> [Char]) -> [Char] -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> [Char] -> [Char]
takeUntilString [Char]
"@@GLIBC"
sections_with_instructions :: [([Char], [Char])]
sections_with_instructions = [
([Char]
"__TEXT",[Char]
"__text"),
([Char]
"__TEXT",[Char]
"__stubs"),
([Char]
"__TEXT",[Char]
"__stub_helper"),
([Char]
"__DATA_CONST",[Char]
"__got"),
([Char]
"__DATA",[Char]
"__la_symbol_ptr"),
([Char]
"__DATA",[Char]
"__nl_symbol_ptr"),
([Char]
"",[Char]
".text"),
([Char]
"",[Char]
".init"),
([Char]
"",[Char]
".plt"),
([Char]
"",[Char]
".plt.got"),
([Char]
"",[Char]
".plt.sec"),
([Char]
"",[Char]
".fini")
]
section_is_unwritable :: ([Char], [Char]) -> Bool
section_is_unwritable s :: ([Char], [Char])
s@([Char]
segname,[Char]
sect_name) =
[Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
or [
[Char]
segname [Char] -> [[Char]] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [[Char]
"__TEXT",[Char]
"__DATA_CONST"],
([Char], [Char])
s ([Char], [Char]) -> [([Char], [Char])] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [ ([Char]
"__DATA",[Char]
"__got"), ([Char]
"__DATA",[Char]
"__const"), ([Char]
"",[Char]
".rodata") ],
([Char], [Char])
s ([Char], [Char]) -> [([Char], [Char])] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [([Char], [Char])]
sections_with_instructions
]
callee_saved_registers :: [Register]
callee_saved_registers = (GPR -> Register) -> [GPR] -> [Register]
forall a b. (a -> b) -> [a] -> [b]
map GPR -> Register
Reg64 [GPR
RBX, GPR
RBP, GPR
RSP, GPR
R12, GPR
R13, GPR
R14, GPR
R15]
return_registers :: [Register]
return_registers = (GPR -> Register) -> [GPR] -> [Register]
forall a b. (a -> b) -> [a] -> [b]
map GPR -> Register
Reg64 [GPR
RAX]
parameter_registers :: [Register]
parameter_registers = (GPR -> Register) -> [GPR] -> [Register]
forall a b. (a -> b) -> [a] -> [b]
map GPR -> Register
Reg64 [GPR
RDI, GPR
RSI, GPR
RDX, GPR
RCX, GPR
R8, GPR
R9]