ASCll码的知识 - 图1

    打开PHP附件,里面是一个代码:

    ASCll码的知识 - 图2

    解码密文:

    ASCll码的知识 - 图3

    首先要搞清楚黑盒的输入和输出:

    Fun(key,data)

    其中key=MD5(“ISCC”)

    str=**fR4aHWwu**FCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA= (也就是刚刚的密文)

    所以我们推测data就是我们需要的flag;再来看黑盒中做了什么事情,黑盒里主要做了三件事:

    1.**char=key+key[:6]**

    2.str[i]=(data[i]+char[i])%128

    3.return base64-encode(str)

    其中第一步和第三步中,我们可以分别通过key的值和base64密文来得到char和str,所以我们只要解决了最重要的第二步就能得到flag(data)了


    接下来使ASCll码和取余符号要有一些了解:

    ASCll码分为不可见字符和可见字符128个字符

    不可见字符范围为:0-31;

    可见字符:32-127;

    其中0-9对应的十进制ASCll码为48-57

    A-Z对应的十进制ASCll码为65-90

    a-z对应的十进制ASCll码为97-122



    知道了这些知识,回来看这一题。一般来说,取余运算是不可逆的,但是这里不一样,因为单个ASCll码%128还是它本身,而str[i]为两个ASCll码和取余128,所以data[i]+char[i]的范围:0-254,再考虑到不可见字符就可以缩小到64-254,再一做取余运算就被分成了两部分

    ASCll码的知识 - 图4

    一部分是始终不大于128的,另一部分是取余大于128的

    前一部分我们在回溯的时候很简单,主要是后一部分,后一部分的范围是0-127,与ASCll范围无二,所以很难分辨,这时候ASCll码非可见字符就可以帮我们筛选掉很大一部分



    一个38个字符,被非可见字符过滤掉28个,这28个字符都属于第二部分的,但是第二部分还有一部分我们没有确定,就是那些范围为(65-127)的,这一部分我们可以利用char来发现他们,既对于范围64-127的字符,如果属于第二部分,那么在str[i]-char[i]那一步就会因为char[i]比str[i]大而报错。



    脚本如下

    ASCll码的知识 - 图5