执行机器码

创建日期:2024-07-13
更新日期:2024-12-27

生成机器码

1、编写代码。

mul.c

int mul(int a, int b)
{
    return a * b;
}

2、编译程序。

gcc -c mul.c -o mul.o

3、提取机器码。

objdump -j .text -d mul.o

输出

mul.o:     file format elf64-x86-64

Disassembly of section .text:

0000000000000000 <mul>:
   0:   f3 0f 1e fa             endbr64
   4:   55                      push   %rbp
   5:   48 89 e5                mov    %rsp,%rbp
   8:   89 7d fc                mov    %edi,-0x4(%rbp)
   b:   89 75 f8                mov    %esi,-0x8(%rbp)
   e:   8b 45 fc                mov    -0x4(%rbp),%eax
  11:   0f af 45 f8             imul   -0x8(%rbp),%eax
  15:   5d                      pop    %rbp
  16:   c3                      ret

执行机器码

1、编写代码。

test.c

#include <stdio.h>
#include <string.h>
#include <sys/mman.h>

int main()
{
    static char code[] = {
        0xf3, 0x0f, 0x1e, 0xfa, // endbr64
        0x55,                   // push   %rbp
        0x48, 0x89, 0xe5,       // mov    %rsp,%rbp
        0x89, 0x7d, 0xfc,       // mov    %edi,-0x4(%rbp)
        0x89, 0x75, 0xf8,       // mov    %esi,-0x8(%rbp)
        0x8b, 0x45, 0xfc,       // mov    -0x4(%rbp),%eax
        0x0f, 0xaf, 0x45, 0xf8, // imul   -0x8(%rbp),%eax
        0x5d,                   // pop    %rbp
        0xc3                    // ret
    };
    void *mem = mmap(NULL, sizeof(code), PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, -1, 0);
    memcpy(mem, code, sizeof(code));
    int (*fn)() = mem;
    printf("14*2=%d\n", fn(14, 2));
    munmap(mem, sizeof(code));
}

2、编译并执行。

gcc test.c -o test
./test

输出结果

14*2=28