我在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汇编程序转储结束。