nnonkey k1n9的博客

当你为错过太阳而哭泣时,你也要再错过群星了——泰戈尔​

脚本学习系列之数组取反

# -*- coding: utf-8 -*
# /usr/bin/python3
# @Author:Firebasky
exp = ""
def urlbm(s):
    ss = ""
    for each in s:
        ss += "%" + str(hex(255 - ord(each)))[2:]
    return f"[~{ss}][!%FF]("
while True:
    fun = input("Firebasky>: ").strip(")").split("(")
    exp = ''
    for each in fun[:-1]:
        exp += urlbm(each)
        print(exp)
    exp += ")" * (len(fun) - 1) + ";"
    print(exp)
    #call_user_func(...unserialize(end(getallheaders())));

首先我们要知道取反的算法原理:
首先取反的实现不是单纯理解为url编码加一个~符号,在php中(~".urlencode(~$code2).")这样可以实现,在python中我们经常通过这样的算法去实现 "%" + str(hex(255 - ord(each)))[2:]下面讲一下原因
首先我们知道取反的底层逻辑

下面以一个简单的例子来说明取反的原理:

假设我们要对整数 -5 进行取反操作。

首先,将 -5 的绝对值的二进制表示形式获取到。-5 的绝对值为 5,其二进制表示为 00000101。

然后,对 5 的二进制表示的每一位进行取反操作,即将 0 变为 1,将 1 变为 0,得到 11111010。

最后,对取反后的结果进行加 1 操作,得到最终的结果 11111011。

对算法的理解:

当我们将字符的 ASCII 码值与 255 相减时,可以将取反操作转换为相应的逻辑运算。这是因为对于一个 8 位的二进制数(如 ASCII 码值),其取反可以通过将每一位取反来实现。

举个例子,假设要对字符 'A' 进行取反操作。字符 'A' 的 ASCII 码值为 65,对应的二进制表示是 01000001。当我们将 255 减去 65,得到 190,对应的二进制表示是 10111110。可以观察到,这个结果是将原来的二进制数的每一位取反得到的。

因此,通过将字符的 ASCII 码值与 255 相减,可以实现对字符的取反。

所以我们可以通过对字符转换为ascii码,然后用255减去字符,再转为16进制,因为16进制0X..,所以我们只需要去后面两位,所以要转化为字符串进行切片操作,然后加上%就得到了我们需要的数字,然后遍历每一个字符即可,再累加上去,

for each in s:

ss += "%" + str(hex(255 - ord(each)))[2:]

就可以实现我们算法的操作,然后就是对数据的处理,我们需要的数据处理是怎么样的?
我们输入a(b(c())),需要返回[~%9e]!%FF));首先就是要对我们输入的数据进行切割为a,b,c,我们观察我们的输入a(b(c())),每(代表了一个新数据,所以我们只需要把(当成标准,怎么实现,split("(")函数就是切割函数,然后看看效果['a', 'b', 'c',')))']发现 只要)))是多余的,我们把它丢弃就好了,因为是个list表,我们进行切片,fun[:-1]即可完成,倒着取,从倒数第二个开始取,现在获得处理的数据
['a', 'b', 'c']
我们把每个数据进行取反后加上~数据,不行还得加上我们去掉的括号

   return f"[~{ss}][!%FF]("

得到的结果是:[~%df%9e][!%FF]([~%9d][!%FF]([~%9c][!%FF](
发现差最后的括号,我们只需要计算原的字符的括号然后加上即可,括号的数量取决于我们处理后的数据的长度,len(fun[:-1])即可 exp += ")" *len(fun[:-1]) + ";"这样就可以实现,所以最后得到脚本

exp = ""
def urlbm(s):
    ss = ""
    for each in s:  #for each使用
        ss += "%" + str(hex(255 - ord(each)))[2:]#切片需要转化为字符串
    return f"[~{ss}][!%FF]("
while True:
    fun = input("请输入你需要构造的字符串>: ").split("(")#分割数据用split
    exp = ''
    print(fun[:-1])
    for each in fun[:-1]:
        exp += urlbm(each)
    exp += ")" *len(fun[:-1]) + ";"  #*的使用
    print(exp)

本原创文章未经允许不得转载 | 当前页面:nnonkey k1n9的博客 » 脚本学习系列之数组取反

评论