编写shellcode测试工具

不知不觉,shellcode已成功攻击过程中必不可少的步骤,后面的文章会继续介绍如何编写其它类型的shellcode。直到目前为止,每次完shellcode汇编代码,都需要找到之前(或者重新编写)带缓冲区溢出漏洞的代码进行测试,同时要不停地对准EIP以及esp地址。这对于测试shellcode的正确性来说,很不方便,也难以调试。为此,我们先编写shellcode测试工具,方便后面测试shellcode,所谓磨刀不误砍柴功。


shellcode测试工具sctest

我们将工具取名为sctest,是shell code test的缩写。
命令用法:sctest  <shellcode二进制文件>

该程序的实现很简单:

1) 读shellcode 二进制读到内存
2)将装载shellcode内存的属性变成可执行
3)跳到该shellcode执行

代码如下:


#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>


char code[4096] __attribute__((aligned(4096)));

int main(int argc, const char *argv[])
{
    int fd;
    int ret;
    void (*func)(void);

    if (argc != 2) {
        fprintf(stderr, "\n\tUsage: sctest <shellcode>\n\n");
        return 1;
    }

    fd = open(argv[1], O_RDONLY);
    if (!fd) {
        fprintf(stderr, "Unable open file %s, err = %d(%m)\n", argv[1], errno);
        return 2;
    }

    ret = read(fd, code, sizeof(code));
    if (ret < 0) {
        fprintf(stderr, "Unable read file %s, err = %d(%m)\n", argv[1], errno);
        return 3;
    }

    ret = mprotect(code, sizeof(code), PROT_EXEC);
    if (ret < 0) {
        fprintf(stderr, "Unable mprotect, err = %d(%m)\n", errno);
        return 4;
    }

    /* execute shell code */
    func = (void (*)(void))code;
    func();
    abort();    
}


编译

到目前为止,shellcode的运行环境都是32位应用程序,以后涉及64位应用程序;由于同一程序不能混搭32和64位指令,因此需要编译两个工具(32位和64位)

$ gcc -Wall -g -o sctest32 sctest.c -m32
$ gcc -Wall -g -o sctest sctest.c

测试以前的shellcode


上篇文章中,介绍如何编写本地shellcode,使用sctest32工具对它进行测试:

当前 bash的pid

$ echo $$
2180

测试shellcode
ivan@ivan:~/exploit/tools$ ./sctest32 ../shell2

运行shellcode后sh的pid
$ echo $$
3178

两个pid不一样,说明 shell2成功启动了一个新sh

在后面的shellcode介绍中,我们会使用sctest32/sctest工具进行独立测试,不依赖于漏洞代码。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值