diff options
| author | Ajax <commial@gmail.com> | 2017-04-05 15:52:01 +0200 |
|---|---|---|
| committer | Ajax <commial@gmail.com> | 2017-04-06 13:47:38 +0200 |
| commit | f0891c67b3860de0ffc716994dfc582aa5f0dea8 (patch) | |
| tree | dc209d08700e7426b610e920726b58a276f97b54 /miasm2/os_dep/linux_stdlib.py | |
| parent | 9ba85c8fb0e1e0bdcbeb93d500a6bebac963a0b0 (diff) | |
| download | miasm-f0891c67b3860de0ffc716994dfc582aa5f0dea8.tar.gz miasm-f0891c67b3860de0ffc716994dfc582aa5f0dea8.zip | |
Add basic libc_start_main stub for Linux
Diffstat (limited to 'miasm2/os_dep/linux_stdlib.py')
| -rw-r--r-- | miasm2/os_dep/linux_stdlib.py | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/miasm2/os_dep/linux_stdlib.py b/miasm2/os_dep/linux_stdlib.py index 683104d0..9e68454c 100644 --- a/miasm2/os_dep/linux_stdlib.py +++ b/miasm2/os_dep/linux_stdlib.py @@ -17,6 +17,36 @@ class c_linobjs(object): linobjs = c_linobjs() +ABORT_ADDR = 0x1337beef + +def xxx___libc_start_main(jitter): + """Basic implementation of __libc_start_main + + int __libc_start_main(int *(main) (int, char * *, char * *), int argc, + char * * ubp_av, void (*init) (void), + void (*fini) (void), void (*rtld_fini) (void), + void (* stack_end)); + + Note: + - init, fini, rtld_fini are ignored + - return address is forced to ABORT_ADDR, to avoid calling abort/hlt/... + + """ + global ABORT_ADDR + ret_ad, args = jitter.func_args_systemv(["main", "argc", "ubp_av", "init", + "fini", "rtld_fini", "stack_end"]) + + # done by __libc_init_first + size = jitter.ir_arch.pc.size / 8 + argv = args.ubp_av + envp = argv + (args.argc + 1) * size + + # Call int main(int argc, char** argv, char** envp) + jitter.func_ret_systemv(args.main) + ret_ad = ABORT_ADDR + jitter.func_prepare_systemv(ret_ad, args.argc, argv, envp) + return True + def xxx_isprint(jitter): ''' |