Skip to content →

标签:ShellCode

提取机器码并运行

构造shellcode,一般是使用高级语言编写一段程序然后编译,反汇编得到十六进制的操作码,或者直接写汇编然后从二进制文件中提取操作码,它们都需要借助反汇编工具或十六进制编辑工具。本文将介绍两段C++代码,其一用于提取机器码,其二用于运行机器码。 提取机器码 以下代码用于自动化提取机器码,只需将汇编代码嵌入TODO位置,然后编译运行即可。代码下载地址:getMachinecode.cpp #inc ……

动态定位 Win32 API 的入口地址

shellcode是一段能够完成某种特定功能的二进制代码,可能是开启一个新的shell或者下载某个特定的程序或者向攻击者返回一个shell等等。在Windows中,完成这些特定功能需要调用某些API,其入口地址可由链接库的装载基地址和API在链接库中的偏移相加得到。早些时候,可以这样来获取API的入口地址:进入VC6.0安装目录下的Tools文件夹,其中Depends.exe工具可以用来查看PE文 ……

Linux系统调用

系统调用是用户态和内核态之间的一座桥梁,大多数操作系统都提供了许多核心函数以供应用程序访问,shellcode当然也需要调用这些函数来完成特定功能。Linux系统提供的核心函数可以方便的实现文件访问、命令执行、网络通信等功能,这些函数就被称为系统调用(System Call)。

为了标识每一个系统调用,在Linux中定义了系统调用号,具体可以到/usr/include/asm/unistd_32.h文件中进行查看;为了将系统调用号和相应的服务例程结合起来,在Linux中还定义了系统调用表sys_call_table,它是一个指针数组,每个元素都指向其下标对应的系统调用号的封装例程。

在linux-headers中也能找到它们的定义,以版本2.6.35为例:

系统调用一般都是通过软件中断实现的。在x86系统中,软件中断由int 0x80指令产生,128号异常处理程序就是系统调用处理程序system_call()。用户程序需要系统提供服务的时候,会产生一个int 0x80的软中断,并通过寄存器eax传递一个系统调用号,系统调用处理程序通过此号从系统调用表中找到相应的内核函数执行,最后返回。

下面的机器码通过系统调用实现了根用户shell提示符的获取。

……