不知不觉,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工具进行独立测试,不依赖于漏洞代码。
版权声明:本文为CSDN博主「海枫」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/linyt/article/details/43538837
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付