Giải mã mã hóa xor


20

Nhiệm vụ của bạn là lấy một chuỗi được mã hóa làm đầu vào và xuất ra chuỗi được giải mã, để tiết lộ thông điệp ẩn của nó.

Các chuỗi, cả đầu vào và đầu ra, sẽ chứa các ký tự từ danh sách 64 ký tự ASCII này (lưu ý khoảng trắng ở đầu):

 !"#$%&'()*+,-./0123456789:;=?@[\]^_abcdefghijklmnopqrstuvwxyz|~

Các ký tự này được gán số, theo thứ tự chúng được liệt kê ở trên:

  ! " # $ % &   ...
0 1 2 3 4 5 6   ...

Vì vậy, không gian là số 0, !là số 1 và ~là số 63. Những số này có thể được biểu diễn trong mã nhị phân 6 bit:

 :  0:  000000
!:  1:  000001
":  2:  000010
#:  3:  000011 
.. ...  ......
z: 61:  111101
|: 62:  111110
~: 63:  111111

Mã hóa rất đơn giản:

Tôi sẽ sử dụng eCcho các ký tự được mã hóa và Ccho các ký tự của chuỗi gốc. C(n)là ký tự thứ n của chuỗi gốc, trong khi đó eC(n)là ký tự thứ n của chuỗi được mã hóa.

Bạn sẽ sử dụng biểu diễn nhị phân 6 bit của các ký tự. Nhân vật đầu tiên sẽ là eC(0) = not(C(0)). Từ đó, tất cả các nhân vật sẽ được eC(n) = xor(C(n),C(n-1)).

Thí dụ:

Giả sử chuỗi đầu vào là code.

  • clà ký tự thứ 38 (không có chỉ mục) hoặc 100110ở dạng nhị phân. Phiên bản được mã hóa có tất cả các bit được lật, vì vậy 011001 -> 25 -> '9'(một lần nữa, không được lập chỉ mục).
  • olà ký tự thứ 50, hoặc 110010ở dạng nhị phân. xor(100110, 110010) = 010100 = 20 = '4'.
  • dlà ký tự thứ 39, hoặc 100111ở dạng nhị phân. xor(100111, 110010) = 010101 = 21 = '5'.
  • elà ký tự thứ 40, hoặc 101000ở dạng nhị phân. xor(101000, 100111) = 001111 = 15 = '/'.

Vì vậy, nếu chuỗi gốc là code, chuỗi được mã hóa sẽ trở thành 945/.


Các trường hợp thử nghiệm:

945/
code

,&'8[14 =?;gp+% 2'@s&&c45/eg8?&
programming puzzles & code golf

;a$5$%0r?2@12dw6# lb-eg&519nt%ot=9$@es@96+?;ga" 4*)&ta56dp[?o#t%oh/"(&?#ee![,+,/+fe4"
a $150 reward will be given to those sending account and pin# to hackers@steal_id.com

~!#!'!#!/!#!'!#![!#!'!#!/!#!'!#!~!#!'!#!/!#!'!#![!#!'!#!/!#!'!#!
 !"#$%&'()*+,-./0123456789:;=?@[\]^_abcdefghijklmnopqrstuvwxyz|~

4
Cuộc sống hôn nhân và đã được giải mã tin nhắn? : p
Jonathan Allan

1
@Jonathan ALLan Tôi đã giải mã tin nhắn trong nhiều năm ...: P
Stewie Griffin

Câu trả lời:


9

Thạch , 27 26 byte

ØJḟ“<>`{}”ḟØAɓi@€_33^\96_ị

Hãy thử trực tuyến!

Phiên bản thay thế, 22 byte (không cạnh tranh)

Jelly cuối cùng đã bắt kịp các lang golf khác và có một nguyên tử ASCII có thể in được , vì vậy điều này hoạt động ngay bây giờ.

ØṖḟ“<>`{}”ḟØAɓi@€’^\Nị

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

ØJḟ“<>`{}”ḟØAɓi@€_33^\96_ị  Main link. Argument: s (string)

ØJ                          Yield Jelly's code page, i.e., 32 non-ASCII characters,
                            followed by all printable ASCII characters, followed by
                            129 non-ASCII characters.
  ḟ“<>`{}”                  Filterfalse; remove the characters "<>`{}".
          ḟØA               Filterfalse; remove all uppercase ASCII letters.
                            Let's call the resulting alphabet a.
             ɓ              Begin a new, dyadic chain.
                            Left argument: s. Right argument: a
              i@€           Find the (1-based) index of all characters of s in a.
                 _33        Subtract 33, so ' ' maps to 0, '~' maps to 63.
                    ^\      Compute the cumulative bitwise XOR.
                            We didn't take the bitwise NOT of the first index,
                            which can be rectified by subtracting all results from
                            63. However, we must also add 33 to account for the
                            fact that the index of ' ' in a is 33.
                      96_   Subtract the results from 96.
                         ị  Index into a.

Tôi nghĩ về điều này trong vài phút cuối! Thật xấu hổ cho tôi vì đã đăng một lời giải thích trước: p
Jonathan Allan

6

JavaScript (ES6), 115 byte

s=>s.replace(/./g,s=>d[x^=d.indexOf(s)],x=63,d=` !"#$%&'()*+,-./0123456789:;=?@[\\]^_abcdefghijklmnopqrstuvwxyz|~`)

Các trường hợp thử nghiệm


Tôi nghĩ rằng ^đi bên phải của ]. Câu trả lời vẫn hoạt động với sự thay đổi đó đối với các trường hợp thử nghiệm mà tôi tin.
Jonathan Allan

Có thể ngắn hơn để xây dựng dtừ những gì còn thiếu?
Jonathan Allan

1
@Jonathan ALLan Có thể, nhưng JS có các phương thức thao tác nhân vật khá dài. Tôi đã thất bại khi có một phiên bản động ngắn hơn một chuỗi mã hóa đơn giản trong các thử thách tương tự trước đó và cho đến nay cũng không có thành công nào.
Arnauld

Tôi biết đây là javascript nhưng hoàn toàn không giống như vậy: S
Slava Knyazev

5

Thạch ,  34  31 byte

-3 byte nhờ Dennis (sử dụng hai lần chứ không phải là œ-, ;¤, sử dụng ”~chứ không phải là 63 )

32r126Ọḟ“<>`{}”ḟØAṙ1ɓ”~;i@€^\Ḋị

Một liên kết đơn và lấy danh sách các ký tự.
* Lưu ý: các đối số đầu vào cho một chương trình Jelly sử dụng Python chuỗi định dạng, vì vậy trích dẫn với ", ', '''(hoặc nếu rõ ràng không trích dẫn) là tất cả các tùy chọn.

Hãy thử trực tuyến!

Làm sao?

Bitwise-xor là không thể đảo ngược (được đưa ra "số không đứng đầu").

Bitwise-Not là một xor với "tất cả những cái" - trong trường hợp này chỉ có 6 cái được yêu cầu, vì vậy 2 7 -1 = 63 .

Khi chúng ta đã tạo mảng hoặc ký tự và tra cứu các chỉ mục của các ký tự đầu vào, bản thân giải mã chỉ đơn giản là giảm tích lũy theo bitwise-xor, sau đó chúng ta có thể lập chỉ mục trở lại vào cùng một mảng.

32r126Ọḟ“<>`{}”ḟØAṙ1ɓ”~;i@€^\Ḋị - Main link: string, s
32r126                          - inclusive range -> [32,33,...,125,126]
      Ọ                         - cast to ordinals -> " !...}~"
        “<>`{}”                 - literal ['<','>','`','{','}']
       ḟ                        - filter discard
                ØA              - yield "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
               ḟ                - filter discard
                  ṙ1            - rotate left by one (Jelly indexing is one based)
                    ɓ           - dyadic chain separation, swapping arguments (call that p)
                     ”~         - literal '~'
                       ;        - concatenate with s (`~` has value 63 for the bitwise-not)
                        i@€     - first index* of €ach character of s in p
                            \   - cumulative reduce by:
                           ^    -   bitwise-xor
                             Ḋ  - dequeue (remove the 63 from '~')
                              ị - index into p

* Lưu ý: tìm kiếm một khoảng trắng trong p sẽ mang lại 64, nhưng điều đó không sao vì việc lập chỉ mục trở lại thành p là mô-đun nên việc thêm một hàng đầu 1cũng giống như thêm 64, đưa chỉ số trở lại đúng nơi cần thiết).


3

Java, 225 byte

String D(String E){String A="",C=" !\"#$%&'()*+,-./0123456789:;=?@[\\]^_abcdefghijklmnopqrstuvwxyz|~";for(int i=-1,J=0;++i<E.length();J=C.indexOf(E.charAt(i)),A+=C.charAt(i<1?(1<<6)-1-J:C.indexOf(A.charAt(i-1))^J));return A;}

Tôi đã không chơi golf ở Java trong một thời gian rất dài, vì vậy mọi mẹo chơi golf đều được đánh giá cao.

Dùng thử trực tuyến!


Tôi biết đã lâu rồi, nhưng một số điều cần chơi golf: sử dụng lambda Java 8+, vì vậy String D(String E){trở thành E->{(-15 byte); -1-Jcó thể là +~J(-1 byte); và i=-1có thể i=0, ++có thể được di chuyển đến i++<1?, và sau đó i-1trở thành i-2(-1 byte). Dùng thử trực tuyến: 208 byte
Kevin Cruijssen

2

05AB1E , 40 byte

'~«vžQAu"<>{}`"«SK©yk64+b¦S}r.gG^DJC®sè?

Hãy thử trực tuyến!

Giải trình

'~«                                       # append input to "~"
   v                                      # for each char y in the resulting string
    žQ                                    # push printable ascii chars
      Au                                  # push upper case alphabet
        "<>{}`"«                          # append "<>{}`"
                SK                        # remove those chars from printable ascii
                  ©                       # store a copy in register
                   yk                     # get the index of y in that string
                     64+                  # add 64
                        b                 # convert to binary
                         ¦S               # remove leading 1 and convert to list of bits
                           }              # end loop
                            r             # reverse stack
                             .gG          # len(stack)-1 times do
                                ^         # xor top 2 lists of bits on the stack
                                 DJC      # convert a copy to decimal
                                    ®sè   # index into the char string with this
                                       ?  # print

2

Tập lệnh CPU x86, 235 byte

00000750  50                push eax
00000751  8A10              mov dl,[eax]
00000753  80FA00            cmp dl,0x0
00000756  7418              jz 0x770
00000758  31DB              xor ebx,ebx
0000075A  EB03              jmp short 0x75f
0000075C  F9                stc
0000075D  EB13              jmp short 0x772
0000075F  8A83C1A14000      mov al,[ebx+0x40a1c1]
00000765  3C00              cmp al,0x0
00000767  74F3              jz 0x75c
00000769  38C2              cmp dl,al
0000076B  7404              jz 0x771
0000076D  43                inc ebx
0000076E  EBEF              jmp short 0x75f
00000770  42                inc edx
00000771  F8                clc
00000772  58                pop eax
00000773  C3                ret
00000774  53                push ebx
00000775  8B442408          mov eax,[esp+0x8]
00000779  31C9              xor ecx,ecx
0000077B  09C0              or eax,eax
0000077D  7505              jnz 0x784
0000077F  31C0              xor eax,eax
00000781  48                dec eax
00000782  EB2F              jmp short 0x7b3
00000784  E8C7FFFFFF        call 0x750
00000789  72F4              jc 0x77f
0000078B  7510              jnz 0x79d
0000078D  F6D3              not bl
0000078F  80E33F            and bl,0x3f
00000792  88D9              mov cl,bl
00000794  8AB3C1A14000      mov dh,[ebx+0x40a1c1]
0000079A  8830              mov [eax],dh
0000079C  40                inc eax
0000079D  E8AEFFFFFF        call 0x750
000007A2  72DB              jc 0x77f
000007A4  750D              jnz 0x7b3
000007A6  30D9              xor cl,bl
000007A8  8AB1C1A14000      mov dh,[ecx+0x40a1c1]
000007AE  8830              mov [eax],dh
000007B0  40                inc eax
000007B1  EBEA              jmp short 0x79d
000007B3  5B                pop ebx
000007B4  C20400            ret 0x4
000007B7  53                push ebx
000007B8  8B442408          mov eax,[esp+0x8]
000007BC  31C9              xor ecx,ecx
000007BE  09C0              or eax,eax
000007C0  7505              jnz 0x7c7
000007C2  31C0              xor eax,eax
000007C4  48                dec eax
000007C5  EB32              jmp short 0x7f9
000007C7  E884FFFFFF        call 0x750
000007CC  72F4              jc 0x7c2
000007CE  750F              jnz 0x7df
000007D0  30D9              xor cl,bl
000007D2  8AB1C1A14000      mov dh,[ecx+0x40a1c1]
000007D8  8830              mov [eax],dh
000007DA  88D9              mov cl,bl
000007DC  40                inc eax
000007DD  EBE8              jmp short 0x7c7
000007DF  8B442408          mov eax,[esp+0x8]
000007E3  E868FFFFFF        call 0x750
000007E8  72D8              jc 0x7c2
000007EA  750D              jnz 0x7f9
000007EC  F6D3              not bl
000007EE  80E33F            and bl,0x3f
000007F1  8AB3C1A14000      mov dh,[ebx+0x40a1c1]
000007F7  8830              mov [eax],dh
000007F9  5B                pop ebx
000007FA  C20400            ret 0x4

Hàm find () và deCript () + chuỗi abc: 171 byte + 64 byte = 235 lắp ráp với nasmw và trình biên dịch / thư viện với trình biên dịch Borland C:

; nasmw -fobj  this.asm
; bcc32 -v  this.obj
section _DATA use32 public class=DATA
global _main
extern _printf

fmt1 db "result=%s" , 13, 10, 0, 0
fmt2 db "abc[63]=%c" , 13, 10, 0, 0
code1 db "code" , 0, 0
code2 db ",&'8[14 =?;gp+% 2'@s&&c45/eg8?&" , 0, 0
code3 db ';a$5$%0r?2@12dw6# lb-eg&519nt%ot=9$@es@96+?;ga" 4*)&ta56dp[?o#t%oh/"(&?#ee![,+,/+fe4"' , 0, 0
abc db ' !"#$%' , "&'()*+,-./0123456789:;=?@[\]^_abcdefghijklmnopqrstuvwxyz|~" , 0, 0

section _TEXT use32 public class=CODE

find:     
      push    eax
      mov     dl,  [eax]
      cmp     dl,  0
      je      .2
      xor     ebx,  ebx
      jmp     short  .1
.e:   stc
      jmp     short  .z
.1:   mov     al,  [abc+ebx]
      cmp     al,  0
      je      .e
      cmp     dl,  al
      je      .3
      inc     ebx
      jmp     short  .1
.2:   inc     edx           ; set zf=0
.3:   clc
.z:   pop     eax
      ret

deCript:  
      push    ebx
      mov     eax,  dword[esp+8]
      xor     ecx,  ecx
      or      eax,  eax
      jnz     .1
.e:   xor     eax,  eax
      dec     eax
      jmp     short  .z
.1:   call    find
      jc      .e
      jnz     .2
      not     bl
      and     bl,  03Fh
      mov     cl,  bl
      mov     dh,  [abc+ebx]
      mov     [eax],  dh
      inc     eax
.2:   call    find
      jc      .e
      jnz     .z
      xor     cl,  bl
      mov     dh,  [abc+ecx]
      mov     [eax],  dh
      inc     eax
      jmp     short  .2
.z:       
      pop     ebx
      ret     4

cript:    
      push    ebx
      mov     eax,  dword[esp+8]
      xor     ecx,  ecx
      or      eax,  eax
      jnz     .1
.e:   xor     eax,  eax
      dec     eax
      jmp     short  .z
.1:   call    find
      jc      .e
      jnz     .2
      xor     cl,  bl
      mov     dh,  [abc+ecx]
      mov     [eax],  dh
      mov     cl,  bl
      inc     eax
      jmp     short  .1
.2:   mov     eax,  dword[esp+8]
      call    find
      jc      .e
      jnz     .z
      not     bl
      and     bl,  03Fh
      mov     dh,  [abc+ebx]
      mov     [eax],  dh
.z:       
      pop     ebx
      ret     4

_main:    
      pushad

      push    code1
      call    cript
      push    code1
      push    fmt1
      call    _printf
      add     esp,  8

      xor     eax,  eax
      mov     al,  [abc+63]
      push    eax
      push    fmt2
      call    _printf
      add     esp,  8

      push    code1
      call    deCript
      push    code1
      push    fmt1
      call    _printf
      add     esp,  8
      push    code2
      call    deCript
      push    code2
      push    fmt1
      call    _printf
      add     esp,  8
      push    code3
      call    deCript
      push    code3
      push    fmt1
      call    _printf
      add     esp,  8

      popad
      mov     eax,  0
      ret

các kết quả:

result=945/
abc[63]=~
result=code
result=programming puzzles & code golf
result=a $150 reward will be given to those sending account and pin# to hackers@steal_id.com

Lắp ráp tốt hơn (giả sử đúng là tôi sử dụng hệ thống macro, vâng tôi biết nó quá dài nhưng với hệ thống C one + - với hệ thống macro, có thể nói là đúng vì các hướng dẫn đơn giản hơn nên dễ dàng viết mã ngay cả khi không có sửa lỗi khi viết bằng tiếng Anh (không phải tôi))


2

C (gcc) , 153 byte

char*i=" !\"#$%&'()*+,-./0123456789:;=?@[\\]^_abcdefghijklmnopqrstuvwxyz|~";a(b){b=index(i,b)-i;}f(char*x){for(*x=i[a(*x)^63];x[1];)*x=i[a(*x)^a(*++x)];}

Hãy thử trực tuyến!

Hơi ít chơi golf

char*i=" !\"#$%&'()*+,-./0123456789:;=?@[\\]^_abcdefghijklmnopqrstuvwxyz|~";
a(b){
  b=index(i,b)-i;
}
f(char*x){
  for(*x=i[a(*x)^63];x[1];)
    *x=i[a(*x)^a(*++x)];
}

2

APL (Dyalog Unicode) , 52 byte SBCS

Đòi hỏi ⎕IO←0

{C[2∘⊥¨≠\~@0⊢(6/2)∘⊤¨⍵⍳⍨C←(32↓⎕UCS127)~⎕A,'<>{}`']}

Hãy thử trực tuyến!



Khi chỉ có một tham chiếu đến , bạn có thể lưu hai byte bằng cách chuyển đổi thành một chương trình đầy đủ:C[2⊥≠\⍉~@0⍉(6/2)⊤⍞⍳⍨C←(32↓⎕UCS⍳127)~⎕A,'<>{}`']
Adám

1

Röda , 120 100 byte

f a{A=[]seq 32,126|chr _|{|v|A+=v if[v=~"[^<>`{}A-Z]"]}_;l=63;a|{|c|l=indexOf(c,A) b_xor l;[A[l]]}_}

Hãy thử trực tuyến!

Tôi đã sử dụng l=63mẹo từ câu trả lời JavaScript. Ngay bây giờ tôi đang làm việc để rút ngắn Aquá trình chơi gôn ...




1

Python + Numpy, 214 byte

Không thể cạnh tranh với giải pháp Python khác, mặc dù sử dụng cách tiếp cận số thuần túy khác nhau:

from numpy import *
def f(s):
    r=range
    A=array
    S=A(r(32,60)+[61,63,64]+r(91,96)+r(97,123)+[124,126])
    T=A(r(128))
    T[S]=A(r(64))
    W=T[fromstring(s,"b")]
    W[0]=~W[0]
    W=S[bitwise_xor.accumulate(W)&63]
    print W.tobytes()[::4]

Một chút giải thích:

  • S=A(r(32,60)+...) - xác định bảng chữ cái là phạm vi mã
  • T=A(r(128)) - bảng băm init có kích thước 128 (điểm mã lớn nhất)
  • T[S]=A(r(64)) - điền vào bảng băm, tức là viết các chỉ số 0-63 cho các phần tử bằng các chỉ mục ASCII
  • W=T[fromstring(s,"b")] - chuyển đổi đầu vào thành mảng và dịch nó thành mã mới
  • W[0]=~W[0] - đảo ngược giá trị thứ 1
  • W=S[bitwise_xor.accumulate(W)&63] - sử dụng phương pháp tích lũy của Numpy với xor để tránh lặp, đặt lại 2 bit trái và dịch lại thành ascii

1

Alice , 46 byte

/" >"{""ZNr\'?wi.h%)qXq&[.&]?oe(K
\"<~`r}A*"!/

Hãy thử trực tuyến!

Giải trình

Nửa đầu của chương trình chạy ở chế độ thứ tự và thiết lập ánh xạ từ số sang ký tự. Nửa thứ hai chạy ở chế độ cardinal và sử dụng ánh xạ này để giải mã đầu vào.

" ~"                    Push this string
    r                   Convert to entire range (all printable ASCII)
     "AZ"               Push this string
         r              Convert to entire range
          "<>`{}"       Push this string
                 *      Append last two strings
                  N     Remove characters from full string
                   !    Copy entire string to tape

'?                      Push 63 (code point of ?) onto the stack
  w                     Store return address (start main loop)
   i                    Take byte of input
    .h%                 Calculate n mod (n+1): this crashes on EOF (-1)
       )                Find byte on tape
        q               Get position on tape
         X              Bitwise XOR with current value
          q&[           Return to tape position 0
             .&]        Move to tape position corresponding to result of earlier XOR
                ?o      Get and output byte at current tape position
                  e(    Search for -1 to left of current tape position (which will put us at position -1)
                    K   Jump to previously pushed return address.

1

Japt -P , 33 byte

;
EkB+"<>}\{`"1
¬i63 åÈ^VaYÃÅm!gV

Hãy thử trực tuyến!

Vì một số lý do, các trường hợp thử nghiệm phản đối việc chạy như một bộ, vì vậy đây là cá nhân thứ hai , thứ bathứ tư .

Giải trình:

;                    #Set E to a string of all printable ASCII characters

Ek          1        #Set V to E with these characters removed:
  B                  # All uppercase letters
   +"<>}\{`"         # and the characters "<>}{`"

¬                    #Turn the input into an array
 i63                 #Add the number 63 to the front of that array
     å     Ã         #Replace each character with:
      È              # The index of the previous decoded character in V
       ^             # Xor with...
        VaY          # The index of the current character in V
            Å        #Remove the extra character
             m!gV    #Map the indexes to the character in V
                     #Join to a string due to the flag

1

APL (NARS), 72 ký tự, 144 byte

{r←6⍴2⋄y←{r⊤⍵}¨¯1+⍵⍳⍨s←⎕AV[33..127]∼⎕A,'{<>}`'⋄y[1]←⊂∼↑y⋄s[1+{r⊥⍵}¨≠\y]}

Điều này giả sử đầu vào luôn nằm trong mảng 's' ... Để hiểu cách giải mã tôi phải viết phiên bản lắp ráp trước ... thử nghiệm:

  h←{r←6⍴2⋄y←{r⊤⍵}¨¯1+⍵⍳⍨s←⎕AV[33..127]∼⎕A,'{<>}`'⋄y[1]←⊂∼↑y⋄s[1+{r⊥⍵}¨≠\y]}
  h ,'6'
f
  h '945/'
code
  h ",&'8[14 =?;gp+% 2'@s&&c45/eg8?&"
programming puzzles & code golf
  h ';a$5$%0r?2@12dw6# lb-eg&519nt%ot=9$@es@96+?;ga" 4*)&ta56dp[?o#t%oh/"(&?#ee![,+,/+fe4"'
a $150 reward will be given to those sending account and pin# to hackers@steal_id.com
  h "~!#!'!#!/!#!'!#![!#!'!#!/!#!'!#!~!#!'!#!/!#!'!#![!#!'!#!/!#!'!#!"
 !"#$%&'()*+,-./0123456789:;=?@[\]^_abcdefghijklmnopqrstuvwxyz|~

1

105 103 byte, mã máy (16-bit x86), 57 hướng dẫn

00000000: ff 01 b9 01 00 89 fa b4 3f cd 21 85 c0 75 02 cd
00000010: 20 8a 05 2c 20 3c 1d 72 1b 48 3c 1e 72 16 48 3c
00000020: 39 72 11 2c 1a 3c 25 72 0b 48 3c 3f 72 06 48 3c
00000030: 40 72 01 48 32 04 24 3f 88 04 3c 3f 72 01 40 3c
00000040: 3e 72 01 40 3c 24 72 01 40 3c 1f 72 02 04 1a 3c
00000050: 1d 72 01 40 3c 1c 72 01 40 04 20 43 89 d9 88 05 
00000060: b4 40 cd 21 4b eb 9b

Đang chạy: lưu vào codegolf.com, dosbox:

codegolf.com < input.bin

Hầu như quên mất phần thú vị: nhập mô tả hình ảnh ở đây

Howdy, đây là mục thứ hai của tôi. Cái trước là RC4 . Xong sử dụng HT hexeditor , không có trình biên dịch , nhưng lần này tôi đang sử dụng Ctrl-a assemble instruction, tôi vẫn không biết liệu đây có phải là mục nhập hay không.

Sao lại như vậy

Theo cách tương tự, tôi đã bắt đầu bằng cách tạo tệp bằng NOPs, sau đó tôi sử dụng lại đọc / ghi từ RC4 . Lần đầu tiên tôi viết bằng python 'thang dịch' từ ascii sang index. và sử dụng nó trong lắp ráp, tạo ra các bậc thang tương tự theo hướng ngược lại, cuối cùng tôi đã thêm một mẹo nhỏ để xử lý byte đầu tiên

Theo cách tương tự với RC4, bước cuối cùng là loại bỏ bổ sung nops, yêu cầu sửa lỗi nhảy.

Mổ xẻ

Một lần nữa chương trình dựa vào giá trị đăng ký ban đầu .

00000000 ff01                    inc         word ptr [bx+di]

Dummy, sẽ cần sau

00000002 b90100                  mov         cx, 0x1
00000005 89fa                    mov         dx, di
00000007 b43f                    mov         ah, 0x3f
00000009 cd21                    int         0x21

đọc byte

0000000b 85c0                    test        ax, ax
0000000d 7502                    jnz         0x11
0000000f cd20                    int         0x20

bỏ nếu stdin kết thúc

00000011 8a05                    mov         al, [di]
00000013 2c20                    sub         al, 0x20
00000015 3c1d                    cmp         al, 0x1d
00000017 721b                    jc          0x34
00000019 48                      dec         ax
0000001a 3c1e                    cmp         al, 0x1e
0000001c 7216                    jc          0x34
0000001e 48                      dec         ax
0000001f 3c39                    cmp         al, 0x39
00000021 7211                    jc          0x34
00000023 2c1a                    sub         al, 0x1a
00000025 3c25                    cmp         al, 0x25
00000027 720b                    jc          0x34
00000029 48                      dec         ax
0000002a 3c3f                    cmp         al, 0x3f
0000002c 7206                    jc          0x34
0000002e 48                      dec         ax
0000002f 3c40                    cmp         al, 0x40
00000031 7201                    jc          0x34
00000033 48                      dec         ax

thang dịch ascii thành chỉ mục (lưu ý rằng tất cả các bước nhảy đều chuyển sang 0x134)

00000034 3204                    xor         al, [si]

xor byte theo byte trước đó, SItrỏ đến địa chỉ 0x100, ban đầu chứa 0xFF từ opcode của một lệnh giả ở trên cùng, dẫn đến hành vi phủ định (nhắc nhở: COM được tải ở 0x100)

00000036 243f                    and         al, 0x3f
00000038 8804                    mov         [si], al

giới hạn kết quả cho chỉ mục và lưu trữ byte ở 0x100,

0000003a 3c3f                    cmp         al, 0x3f
0000003c 7201                    jc          0x3f
0000003e 40                      inc         ax
0000003f 3c3e                    cmp         al, 0x3e
00000041 7201                    jc          0x44
00000043 40                      inc         ax
00000044 3c24                    cmp         al, 0x24
00000046 7201                    jc          0x49
00000048 40                      inc         ax
00000049 3c1f                    cmp         al, 0x1f
0000004b 7202                    jc          0x4f
0000004d 041a                    add         al, 0x1a
0000004f 3c1d                    cmp         al, 0x1d
00000051 7201                    jc          0x54
00000053 40                      inc         ax
00000054 3c1c                    cmp         al, 0x1c
00000056 7201                    jc          0x59
00000058 40                      inc         ax
00000059 0420                    add         al, 0x20

thang theo hướng ngược lại

0000005b 43                      inc         bx
0000005c 89d9                    mov         cx, bx
0000005e 8805                    mov         [di], al
00000060 b440                    mov         ah, 0x40
00000062 cd21                    int         0x21
00000064 4b                      dec         bx

đặt byte dưới [di], ghi byte vào thiết bị xuất chuẩn (lưu ý rằng AH = 40h sử dụng DX làm địa chỉ, nhưng nó được đặt ở trên cùng, khi đọc byte)

lưu ý rằng stdin -> stdout và stdout to stdin được thực hiện bằng inc bx / dec bx

00000067 eb99                    jmp         0x2

vòng lặp ^^

Công cụ và tài nguyên

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.