最新消息:本站技术交流 QQ 群:28124927

使用 NASM 在 macOS 下编写汇编

iOS/MacOSX/移动安全 exchen 19310浏览 0评论

一、下载 NASM

macOS 自带 NASM 编译器,但是版本比较低,只能编译 32 位的程序,最好是下载新版的编译器。

官网地址:http://www.nasm.us

我下载的是最新版 nasm-2.13.02rc2 版本。

二、设置环境变量

下载完成之后解压,然后设置一下环境变量,使用 echo $PATH 查看当前环境变量

修改 ~/.bash_profile,如果不存在该文件则添加

在 .bash_profile 文件里输入以下语句,这样相当于每次打开终端会执行这个命令,实现了自动设置环境变量。

三、编写 HelloWorld

编写代码如下:

编译:

链接:

运行结果:

SECTION .data 表示数据段。
SECTION .text 表示代码段。

global 表示是对外公开函数的名称,这样 ld 时就可以指定它为入口函数。
syscall 是内核调用函数,在 syscall.h 中可以找到调用的具体作用,在 macOS 下调用号需要 0×2000000 + unix syscall #

看下反汇编后的效果:

四、函数调用的参数传递

上面我们试了通过 syscall 输出 Helloworld,这节我们来了解一下在 x64 汇编里函数怎么传递参数的。Windows 平台的 64 位汇编函数传递参数和 macOS 是不一样的,在 Windows 平台 64 位汇编函数传递参数按照从右到左的顺序,顺序是 RCX、RDX、R8、R9,如果还有更多的参数,就通过椎栈传递,而 macOS 64 位汇编里函数传递参数按照从左到右的顺序,依次通过寄存器 RDI、RSI、RDX、RCX、R8、R9 来传递,如果参数个数超过了这么多,那么多余的参数通过栈来传递。

由于使用了 printf 函数,所以链接的时候,记得要把 /usr/lib/libSystem.B.dylib 放进去

输出的结果:

再来看一段代码,该段代码演示函数的六个参数传递

输出结果:

当需要传递第七个以及七个以上的参数,就要使用栈来传递,以下代码演示了通过栈传递十个参数。

五、局部变量的使用


全局变量都是定义在数据段里,在编译文件的时候直接就编译到文件体里了,而局部变量是定义在栈中,在使用的时候才会在栈中分配,所以在编写 ShellCode 的时候只能使用局部变量,不要使用全局变量。以下代码演示如何使用局部变量

输出结果:

六、编写 ShellCode


通过上面的了解,我们尝试一下编写一段 ShellCode,然后将 ShellCode 放到其他程序中去执行。

输出结果:

将汇编对应的机器码复制就是一段 ShellCode,将这段数据复制到其他程序中,调用之后就可以得到执行。

转载请注明:exchen's blog » 使用 NASM 在 macOS 下编写汇编

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (1)

  1. 学习了,很好的入门知识。
    Bugbuer6年前 (2018-11-30)回复