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