-
Notifications
You must be signed in to change notification settings - Fork 0
jhswartz/mli-amd64
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
MACHINE LANGUAGE INTERPRETER / AMD64
A Linux/amd64 binary format interpreter for machine code.
BUILD
$ mle < src/mli.src > src/mli.obj
$ tools/shelf tools/plan src/mli.obj > bin/mli
$ chmod 755 bin/mli
$ ls -al bin/mli
-rwxr-xr-x 1 user user 4096 Aug 26 05:08 bin/mli
INSTALLATION
# cp -a bin/mli /bin/mli
# mount -t binfmt_misc none /proc/sys/fs/binfmt_misc
# cat misc/binfmt/mli-amd64 > /proc/sys/fs/binfmt_misc/register
# cat /proc/sys/fs/binfmt_misc/mli-amd64
enabled
flags:
offset 0
magic 90
USAGE
$ mle < demo/src/cat.src > demo/bin/cat
$ chmod u+x demo/bin/cat
$ wc -c demo/bin/cat
87 demo/bin/cat
$ strace -s 0 demo/bin/cat src/mli.src
execve("demo/bin/cat", [...], 0x7ffc235d5088 /* 39 vars */) = 0
open("demo/bin/cat", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0755, st_size=87, ...}) = 0
mmap(NULL, 87, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, 3, 0) = ...
open("src/mli.src", O_RDONLY) = 4
read(4, ""..., 2048) = 1350
write(1, ""..., 1350) = 1350
[ . x86 ]
Start:
# Gather argc and skip argv[0].
5a # pop rdx
5f # pop rdi
# Abort if no arguments were supplied.
ff ca # dec edx
74 [ rel8 Abort ] # jz Abort
Open:
# open(argv[1], O_RDONLY);
48 8b 3c 24 # mov argv[1] rdi
33 f6 # mov O_RDONLY esi
6a 02 58 # mov SYS_OPEN rax
0f 05 # syscall
# Abort on failure.
48 85 c0 # test rax rax
78 [ rel8 Abort ] # js Abort
# Preserve the reduced argument count.
52 # push rdx
# Stash the descriptor for mmap(2).
50 # push rax
GetFileSize:
# Borrow 144 bytes from the stack for status.
48 8d b4 24 70 ff ff ff # lea (rsp - 144) rsi
# fstat(descriptor, &status);
50 5f # mov rax rdi
6a 05 58 # mov SYS_FSTAT rax
0f 05 # syscall
# Abort on failure.
48 85 c0 # test rax rax
75 [ rel8 Abort ] # jnz Abort
MapFile:
# mmap(NULL, size, prot, flags, descriptor, 0);
4d 31 c9 # mov 0 r9
41 58 # mov descriptor r8
6a 02 41 5a # mov MAP_PRIVATE r10
6a 07 5a # mov READ|WRITE|EXEC rdx
48 8b 76 30 # mov status.st_size rsi
31 ff # mov NULL rdi
6a 09 58 # mov SYS_MMAP rax
0f 05 # syscall
# Abort on failure.
48 85 c0 # test rax rax
78 [ rel8 Abort ] # js Abort
RunProgram:
ff e0 # jmp rax
Abort:
6a 01 5f # mov EXIT_FAILURE rdi
6a 3c 58 # mov SYS_EXIT rax
0f 05 # syscall
read(4, "", 2048) = 0
exit(0) = ?
+++ exited with 0 +++
DEBUGGING
$ gdb -q -ex 'b *0x40000848' -ex 'r' -ex 'display/4i $pc' --args bin/mli demo/bin/cat
Reading symbols from bin/mli...
(No debugging symbols found in bin/mli)
Breakpoint 1 at 0x40000848
Starting program: /home/user/src/ml/mli-amd64/bin/mli demo/bin/cat
Breakpoint 1, 0x0000000040000848 in ?? ()
1: x/4i $pc
=> 0x40000848: jmp *%rax
0x4000084a: push $0x1
0x4000084c: pop %rdi
0x4000084d: push $0x3c
(gdb) stepi
0x00007ffff7ff8000 in ?? ()
1: x/4i $pc
=> 0x7ffff7ff8000: nop
0x7ffff7ff8001: pop %rcx
0x7ffff7ff8002: pop %rdi
0x7ffff7ff8003: dec %ecx
SEE ALSO
https://github.com/jhswartz/shelf
https://github.com/jhswartz/mle
https://github.com/jhswartz/mlx
AUTHOR
Justin Swartz <justin.swartz@risingedge.co.za>
About
Linux/amd64 binary format interpreter for machine code.