Xor 암호화 해독


20

당신의 임무는 암호화 된 문자열을 입력으로 가져 와서 해독 된 문자열을 출력하여 숨겨진 메시지를 표시하는 것입니다.

입력 및 출력 문자열에는이 64 개의 ASCII 문자 목록에있는 문자가 포함됩니다 (앞 공백 참조).

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

이 문자들은 위에 나열된 순서대로 번호가 할당됩니다.

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

따라서 공백은 숫자 0, !숫자 1, ~숫자 63입니다.이 숫자는 6 비트 이진 코드로 나타낼 수 있습니다.

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

암호화는 매우 간단합니다.

내가 사용합니다 eC암호화 된 문자 및 C원래 문자열의 문자. C(n)는 원래 문자열 eC(n)의 n 번째 문자이며 암호화 된 문자열의 n 번째 문자입니다.

문자의 6 비트 이진 표현을 사용합니다. 첫 번째 문자는입니다 eC(0) = not(C(0)). 거기에서 모든 문자는입니다 eC(n) = xor(C(n),C(n-1)).

예:

입력 문자열이이라고 가정 해 봅시다 code.

  • c38 번째 문자 (인덱싱 된 0) 또는 100110이진수입니다. 암호화 된 버전은 모든 비트가 뒤집어 지므로 011001 -> 25 -> '9'색인이 0으로 설정됩니다.
  • o50 번째 문자 또는 110010이진수입니다. xor(100110, 110010) = 010100 = 20 = '4'.
  • d39 번째 문자 또는 100111이진수입니다. xor(100111, 110010) = 010101 = 21 = '5'.
  • e40 번째 문자이거나 101000이진수입니다. xor(101000, 100111) = 001111 = 15 = '/'.

따라서 원래 문자열이 code인 경우 암호화 된 문자열이됩니다 945/.


테스트 사례 :

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
결혼 생활과 이미 메시지의 디코딩? : p
Jonathan Allan

1
@JonathanAllan 수년간 메시지를 해독 해 왔습니다 ... : P
Stewie Griffin

답변:


9

젤리 , 27 26 바이트

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

온라인으로 사용해보십시오!

대체 버전, 22 바이트 (비경쟁)

젤리는 마침내 다른 골프 랭귀를 따라 잡을 수 있고 인쇄 가능한 ASCII 원자를 얻었습니다 .

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

온라인으로 사용해보십시오!

작동 원리

Ø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.

지난 몇 분 안에 이것을 생각 했어! 먼저 설명을 게시 한 것에 대해 수치심을 느끼십시오 : p
Jonathan Allan

6

자바 스크립트 (ES6), 115 바이트

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

테스트 사례


나는 ^의 오른쪽으로 간다고 생각 합니다 ]. 대답은 여전히 ​​내가 믿는 테스트 사례에 대한 변경 사항과 함께 작동합니다.
Jonathan Allan

d누락 된 것으로부터 구성하는 것이 더 짧을 수 있습니까?
Jonathan Allan

1
@JonathanAllan 어쩌면 JS에는 꽤 긴 문자 조작 방법이 있습니다. 이전의 비슷한 과제에서 간단한 하드 코딩 된 문자열보다 짧은 동적 버전을 사용하지 못했으며 지금까지 성공하지 못했습니다.
Arnauld

나는 이것이 자바 스크립트라는 것을 알고 있지만 전혀 그렇지 않다 : S
Slava Knyazev

5

젤리 ,  34  31 바이트

-3 (데니스 사용 덕분 바이트 보다는 두 번 œ-, ;그리고 ¤, 사용 ”~하기보다는 63 )

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

문자 목록을 가져오고 리턴하는 모나드 링크.
* 참고 : 젤리 프로그램의 입력 인수는 파이썬 문자열, 서식 그래서 함께 인용 활용 ", ', '''모든 옵션이 있습니다 (또는 모호없이 인용하는 경우).

온라인으로 사용해보십시오!

방법?

Bitwise-xor는 되돌릴 수 없습니다 ( "리딩 제로"제공).

Bitwise-Not은 "모두 하나"가있는 xor입니다.이 경우에는 6 개만 필요하므로 2 7 -1 = 63 입니다.

배열을 생성하고 입력 문자의 색인을 조회 한 후에는 디코드 자체가 단순히 비트 단위 xor만큼 누적 감소 된 후 동일한 배열로 다시 색인 될 수 있습니다.

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

* 참고 : p에서 공백을 찾으면 64가 나오지만 p로 다시 인덱싱하는 것은 모듈 식이므로 선행을 추가하는 1것은 64를 추가하는 것과 같으므로 인덱스를 필요한 곳으로 가져갑니다.)


3

자바, 225 바이트

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;}

Java에서 오랫동안 골프를 치지 않았으므로 골프 팁을 얻을 수 있습니다.

온라인으로 사용해보십시오!


나는 그것이 오래되었다는 것을 알고 있지만 골프를해야 할 것들 : Java 8 + 람다를 사용 String D(String E){하면 E->{(-15 바이트)가됩니다. (-1 바이트) 일 -1-J수 있습니다 +~J. 그리고 i=-1될 수 i=0는이 ++이동 될 수있는 i++<1?, 다음이 i-1된다 i-2(-1 바이트). 온라인 시도 : 208 바이트
Kevin Cruijssen

2

05AB1E , 40 바이트

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

온라인으로 사용해보십시오!

설명

'~«                                       # 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

CPU x86 명령어 세트, 235 바이트

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

find () 및 deCript () + 문자열 abc : nasmw를 사용한 171 바이트 + 64 바이트 = 235 어셈블리 및 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

결과 :

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

어셈블리가 더 낫습니다 (예를 들어, 매크로 시스템을 사용한다는 사실은 그렇습니다.하지만 너무 길다는 것을 알고 있지만 매크로 시스템이있는 C one +-이므로 명령이 더 간단하기 때문에 사실이 없어도 어셈블리에 코드를 작성하는 것이 쉽습니다) 영어로 쓴 글로 정정하십시오 (I 아님)


2

C (gcc) , 153 바이트

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)];}

온라인으로 사용해보십시오!

약간 덜 골프

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 바이트 SBCS

필요 ⎕IO←0

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

온라인으로 사용해보십시오!



에 대한 참조가 하나 뿐인 경우 전체 프로그램으로 변환하여 2 바이트를 절약 할 수 있습니다.C[2⊥≠\⍉~@0⍉(6/2)⊤⍞⍳⍨C←(32↓⎕UCS⍳127)~⎕A,'<>{}`']
Adám



1

PHP, 103 바이트

for($x=63;~$c=$argn[$i++];)echo($a=join(preg_grep("#[^A-Z<>`{}]#",range(" ","~"))))[$x^=strpos($a,$c)];

온라인으로 사용해보십시오!

PHP, 107 바이트

for($x=63;~$c=$argn[$i++];)echo($a=preg_filter("#[A-Z<>`{}]#","",join(range(" ","~"))))[$x^=strpos($a,$c)];

온라인으로 사용해보십시오!

PHP, 118 바이트

for($x=63;~$c=$argn[$i++];)echo($a=join(array_diff(range(" ","~"),range(A,Z),str_split("<>`{}"))))[$x^=strpos($a,$c)];

온라인으로 사용해보십시오!


1

Python + Numpy, 214 바이트

다른 순수한 숫자 접근 방식을 사용하지만 다른 Python 솔루션과 경쟁 할 수 없습니다.

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]

약간의 설명 :

  • S=A(r(32,60)+...) -알파벳을 코드 범위로 정의
  • T=A(r(128)) -크기가 128 인 init 해시 테이블 (가장 큰 코드 포인트)
  • T[S]=A(r(64)) -해시 테이블을 채 웁니다. 즉, ASCII 인덱스가있는 요소에 인덱스 0-63을 씁니다.
  • W=T[fromstring(s,"b")] -입력을 배열로 변환하고 새로운 코드로 변환
  • W[0]=~W[0] -첫 번째 값 반전
  • W=S[bitwise_xor.accumulate(W)&63] -xor와 함께 Numpy의 축적 방법을 사용하여 루핑을 피하고 2 개의 왼쪽 비트를 재설정하고 ASCII로 다시 변환하십시오.

1

Alice , 46 바이트

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

온라인으로 사용해보십시오!

설명

프로그램의 전반부는 서수 모드에서 실행되며 숫자에서 문자로의 매핑을 설정합니다. 후반은 기본 모드에서 실행되며이 매핑을 사용하여 입력을 디코딩합니다.

" ~"                    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 바이트

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

온라인으로 사용해보십시오!

어떤 이유로 테스트 케이스는 스위트로 실행되는 것을 반대하므로 두 번째 , 세 번째네 번째가 개별적으로 있습니다.

설명:

;                    #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 자, 144 바이트

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

이것은 입력이 항상 배열 's'에 있다고 가정합니다. 해독 방법을 이해하려면 먼저 어셈블리 버전을 작성해야했습니다 ... 테스트 :

  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

105103 바이트, 머신 코드 (16 비트 x86), 57 명령어

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

실행 중 : codegolf.com에 저장, dosbox :

codegolf.com < input.bin

거의 재미있는 부분을 잊어 버렸습니다. 여기에 이미지 설명을 입력하십시오

Howdy, 이것은 나의 두 번째 항목이다. 이전은 RC4 였습니다 . 사용 완료 HT의 hex 에디터를 , 컴파일러없이 , 이번에는 내가 Ctrl 키-A를 사용했다assemble instruction , I 아직도 몰라 경우 항목 여부 등이 계산됩니다.

왜 어떻게

비슷한 방식으로 NOPs로 파일을 작성하여 시작한 다음 RC4 에서 읽거나 쓰는 것을 재사용했습니다 . 나는 먼저 ASCII에서 색인으로 파이썬 '번역 사다리'로 작성했습니다. 어셈블리에서 역방향으로 비슷한 사다리를 만들고 마지막으로 첫 번째 바이트를 처리하는 작은 트릭을 추가했습니다.

RC4와 비슷한 방식으로 마지막 단계는 추가 nops점프를 제거하고 고정 점프가 필요했습니다.

해부

다시 프로그램은 초기 레지스터 값 에 의존 합니다 .

00000000 ff01                    inc         word ptr [bx+di]

더미, 나중에 필요합니다

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

바이트 읽기

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

stdin이 끝나면 종료

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

ascii를 색인으로 변환하는 사다리

00000034 3204                    xor         al, [si]

x 또는 이전 바이트 단위의 SIaddress는 address를 가리 킵니다. 0x100처음에는 위의 더미 명령어의 opcode에서 0xFF를 포함하여 동작이 부정적입니다 (알림 : COM은 0x100에로드 됨)

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

결과를 색인으로 제한하고 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

반대 방향으로 사다리

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

바이트를 [di] 아래에 넣고 바이트를 stdout에 씁니다 (AH = 40h는 주소로 DX를 사용하지만 바이트를 읽을 때 맨 위에 설정되었음을 명심하십시오)

stdin-> stdout 및 stdout to stdin은 inc bx / dec bx를 사용하여 수행됩니다.

00000067 eb99                    jmp         0x2

루프 ^^

도구 및 리소스

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.