Skip to content

jhswartz/mli-amd64

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

59 Commits
 
 
 
 
 
 
 
 
 
 
 
 

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.

Topics

Resources

Stars

Watchers

Forks

Languages