Minix上的汇编



我在Windows7 64位的VMWare上安装了Minix 3。我试图在这个虚拟机上练习组装。作为开始,我尝试了一个简单的程序,将数字加载到eax和ebx中,并调用o/s来终止程序。

.globl _start:
.section .text
_start:
movl $1, %eax
movl $0, %ebx
int $0x80

编译器和链接器不会引发任何错误或警告,但当我运行可执行文件时,我得到

PM: coredump signal 11 for 282 / <program name>
memory fault

这是由于主机是64位机器引起的吗?是因为minix有不同的o/s调用吗?我试着在网上专门搜索minix的o/s调用,我找到了特定o/s调用的解决方案,但没有o/s调用表。有人能给我指个方向吗?

给你:

minix-exit。S

<>之前.section。text.global的地方的地方:/* _exit(17) */和$0xfffffff0, %esp子$0x40, %esp$17, 0x18(%esp)/*退出状态*/0x10(%esp), %ebx$1, 0x04(%ebx)/* EXIT in include/minix/callnn .h */$0, %eax/* PM_PROC_NR在include/minix/com.h */$0x3, %ecx/* SENDREC in include/minix/ipcconst.h */int $33/* ipcvec_origin in sys/arch/i386/include/asm.h */之前

构建并运行:

<>之前$ clang - nodhlib minix-exit。S -o mini -exit美元。/minix-exit;echo $ ?17之前

我发现弄清楚Minix 3的系统调用实现的最简单的方法是在阅读代码之前做一些反向工程:

调用序列

Minix作为一个微内核,坚持将系统调用构建为可以发送给不同管理器的消息。exit()通过向PM_PROC_NR发送EXIT来实现:

  • _exit(status) (in lib/libc/sys-minix/_exit.c)
    • _syscall(PM_PROC_NR, EXIT, msg)(在lib/libc/sys-minix/sycall .c中)
      • _sendrec_orig(PM_PROC_NR, msg)(在lib/libc/拱/i386/sys-minix/_ipc.S)

通过逆向工程来解决这个问题

看看像/bin/cat这样简单的静态链接可执行文件是如何在Minix上实现_exit()的。

dis.gdb

<>之前设置分页为0文件/bin/cat设置登录拆卸_exit拆卸_syscallx/0 x8072678拆卸_sendrec_orig辞职之前运行:

gdb -q -x dis.gdb

GDB输出<>之前Dump函数_exit的汇编代码:0x0805b780: push %ebp0x0805b781: mov %esp,%ebp0x0805b783:和$0xfffffff0,%esp0x0805b789: sub $0x40,%esp0x0805b78c: mov 0x8(%ebp),%eax0x0805b78f: mov %eax,0x18(%esp)0x0805b793: lea 0x10(%esp),%eax0x0805b797: mov %eax,0x8(%esp)0x0805b79b: movl $0x1,0x4(%esp)0x0805b7a3: movl $0x0,(%esp)0x0805b7aa:呼叫0x805dfc00x0805b7af:呼叫0x805b7af0x0805b7b4: nopw %cs:0x0(%eax,%eax,1)0x0805b7c0: JMP 0x805b7c0汇编程序转储结束。转储系统调用函数的汇编代码:0x0805dfc0: push %ebp0x0805dfc1: mov %esp,%ebp0x0805dfc3: push %esi0x0805dfc4: sub $0xc,%esp0x0805dfc7: mov 0xc(%ebp),%eax0x0805dfca: mov 0x10(%ebp),%esi0x0805dfcd: mov %eax,0x4(%esi)0x0805dfd0: mov %esi,0x4(%esp)0x0805dfd4: mov 0x8(%ebp),%ecx0x0805dfd7: mov % ex,(%esp)0x0805dfda:呼叫*0x80726780x0805dfe0:测试%eax,%eax0x0805dfe2: je 0x805dfe90x0805dfe4: mov %eax,0x4(%esi)0x0805dfe7: JMP 0x805dfec0x0805dfe9: mov 0x4(%esi),%eax0x0805dfec:测试%eax,%eax0x0805dfee: JNS 0x805e0000x0805dff0: mov %eax,%esi0x0805dff2:负%esi0x0805dff4:呼叫0x805e0100x0805dff9: mov %esi,(%eax)0x0805dffb: mov $0xffffffff,%eax0x0805e000:添加$0xc,%esp0x0805e003:弹出%esi0x0805e004:弹出%ebp0x0805e005汇编程序转储结束。0x8072678: 0x805e100函数_sendrec_origin的汇编代码转储:0x0805e100: push %ebp0x0805e101: mov %esp,%ebp0x0805e103: push %ebx0x0805e104: mov 0x8(%ebp),%eax0x0805e107: mov 0xc(%ebp),%ebx0x0805e10a: mov $0x3,%ecx0x0805e10f: int $0x210x0805e111:弹出%ebx0x0805e112:弹出%ebp0x0805e113: ret0x0805e114: lea 0x0(%esi),%esi0x0805e11a: lea 0x0(%edi),%edi汇编程序转储结束。

相关内容

  • 没有找到相关文章

最新更新