搜索
    Hi~登录注册
    查看: 178|回复: 0
    收起左侧

    网鼎杯白虎组【张三base64】WP详解

    [复制链接]

    73

    主题

    2

    精华

    39 小时

    在线时间

    注册会员

    Rank: 2

    积分
    123
    发表于 2020-5-21 08:59:21 | 显示全部楼层 |阅读模式
    题目:张三发现一个很像base64的密文,但并解不开,附件内容:
      密文:uLdAuO8duojAFLEKjIgdpfGeZoELjJp9kSieuIsAjJ/LpSXDuCGduouz
      泄露的密文:pTjMwJ9WiQHfvC+eFCFKTBpWQtmgjopgqtmPjfKfjSmdFLpeFf/Aj2ud3tN7u2+enC9+nLN8kgdWo29ZnCrOFCDdFCrOFoF=
      泄露的明文:[email protected]%^&*Sd4564sd879s5d12f231a46qwjkd12J;DJjl;LjL;KJ8729128713
    ------------------------------------------------------------------------------------------------------------------------------------------------

    此题开局思路很明确,将已知明文:[email protected]%^&*Sd4564sd879s5d12f231a46qwjkd12J;DJjl;LjL;KJ8729128713以base64编码后得到:

    YXNobGtqIUBzajEyMjMlXiYqU2Q0NTY0c2Q4NzlzNWQxMmYyMzFhNDZxd2prZDEySjtESmpsO0xqTDtLSjg3MjkxMjg3MTM=
    与其密文
    pTjMwJ9WiQHfvC+eFCFKTBpWQtmgjopgqtmPjfKfjSmdFLpeFf/Aj2ud3tN7u2+enC9+nLN8kgdWo29ZnCrOFCDdFCrOFoF=

    对比很容易发现,相同字符位完全一一对应,见下图:
    111.jpg
    其它字符也都是一一对应关系,由此我们只需要将flag密文,一一对应为真正的Base64密文即可
    由于base64是流式加密,我们先整理出前8位(都能对应出)ZmxhZ3sx,解之得到flag{1,很明显思路完全正确,
    但马上就陷入僵局:密文字典关系不全,泄露的密文并不包括全部的64个字符集,导致很多位无法对出正确的密文字符,好多人基本都在这里放弃了。

    既然这样,我们写个脚本,先得到已知密文对应关系,剩余的就进行采解。

    已知密文对应关系,
    [w] => b
    [v] => a
    【u】 => Z
    [t] => 2
    [r] => g
    [q] => c
    [p] => Y
    [o] => T
    [n] => S
    [m] => Q
    [k] => O
    [j] => N
    【i】 => I
    [g] => 0
    [ f] => z
    [e] => y
    [d] => x
    [Z] => L
    [W] => q
    [T] => X
    [S] => W
    [Q] => U
    [P] => 4
    [O] => 3
    [N] => p
    [M] => o
    [L] => m
    [K] => l
    [J] => G
    [H] => B
    [F] => M
    [D] => k
    [C] => j
    [ B] => i
    [A] => h
    [=] => =
    [9] => t
    [8] => s
    [7] => r
    [3] => d
    [2] => D
    [/] => F
    [+] => E



    未知密文对应关系有:
    [0] => A
    [2] => C
    [7] => H
    [9] => J
    [10] => K
    [15] => P
    [30] => e
    [31] => f
    [39] => n
    [46] => u
    [47] => v
    [48] => w
    [53] => 1
    [57] => 5
    [58] => 6
    [59] => 7
    [60] => 8
    [61] => 9
    [62] => +
    [63] => /

    先将未知的密文字符用*号代替得到伪密文,然后将每4位一组拆分,
    uLdA uO8d uojA FLEK jIgd pfGe ZoEL jJp9 kSie uIsA jJ/L pSXD uCGd uouz 密文
    Zmxh Z3sx ZTNh Mm*l N*0x Yz*y LTVm NGYt OWIy Z**h NGFm YWRk Zj*x ZTZ* 伪base64密文
    将带有星号的组整理出来,
    ["Mm*l", "N*0x" ,"Yz*y","LT*m",        "Z**h","YW*k","Zj*x","ZTZ*"]

    然后将每4位一组拆分,将带有星号的组整理出来,发现总有5组有星号,
    然后将 带星号的组整理出来,进行各个单独猜解,猜解正确的情况应当是 3个范围为0-9、a-f、-、}的组合(flag的字符范围,“{”这个已在 前8位中解出,所以后面必然没有)
    其解出匹配正确的正则为:/^[0-9a-f}-]{3}$/,然后穷举得到所有的可能组合。

    结果为:
    Yz*y   [A]   c02
    Zj*x   [A]   f01
    N*0x   [C]   4-1
    N*0x   [H]   4}1
    Mm*l   [J]   2be
    LT*m   [J]   -2f
    YW*k   [J]   abd
    Mm*l   [R]   2de
    LT*m   [R]   -4f
    YW*k   [R]   add
    Mm*l   [V]   2ee
    LT*m   [V]   -5f
    YW*k   [V]   aed
    N*0x   [n]   6}1
    ZTZ*   [9]   e6}

    里面的唯一项,即可确认对关系,

    最后一组 ZTZ*唯一,其对应uouz,则确定 z=>9
    再如     Zj*x唯一,其对应uCGd,则确定 G=>A
    接着看   N*0x虽不唯一,但N*0x   [H]   4}1 这项明显不成立,因为带最后一组已解出},其它项不可能有此结果,
    N*0x   [C]   4-1 这一项是正确的,即I=>C
    所以可确定 I=>C ;

    将已确定的3项补充到对应关系中,再次得到伪Base64密文,注意刚才分组中有 Z**h,这个未破出来,现在已知了I为C,
    将它替换后,得到ZC*h,再次猜解,得到 一个新的对应关系 ZC*h   [1]   d-a,即 s=>1,
    最后得到 ZmxhZ3sxZTNhMm*lNC0xYzAyLT*mNGYtOWIyZC1hNGFmYW*kZjAxZTZ9,只有3个星了。

    Mm*l   [J]   2be
    LT*m   [J]   -2f
    YW*k   [J]   abd
    Mm*l   [R]   2de
    LT*m   [R]   -4f
    YW*k   [R]   add
    Mm*l   [V]   2ee
    LT*m   [V]   -5f
    YW*k   [V]   aed

    即剩:"Mm*l" LT*m YW*k 这三组,

    最后可能的对应关系为, J R V,
    列出所有可能:

    当E为J
    则X可能为R,V ;

    当E为R
    则X可能为J,V ;

    当E为V
    则X可能为J,R ;
    总6种情况,也就是将来会得到6个flag,一一尝试即可:

    将 上面6种组合分别测试,得到6种base64,解之得到6个flag。

    结果:

    flag{1e3a2be4-1c02-2f4f-9b2d-a4af-addf01e6}
    flag{1e3a2be4-1c02-2f4f-9b2d-a4af-aedf01e6}
    flag{1e3a2de4-1c02-4f4f-9b2d-a4af-abdf01e6}
    flag{1e3a2de4-1c02-4f4f-9b2d-a4af-aedf01e6}
    flag{1e3a2ee4-1c02-5f4f-9b2d-a4af-abdf01e6}
    flag{1e3a2ee4-1c02-5f4f-9b2d-a4af-addf01e6}

    一一提交测试。即可。至于能不能准确确定所有的对应关系,发现并没有什么规律,正有规律的时候,遇到*号处,刚好就没规律了,应该是出题者故意为之。

    附上脚本,做题时写的,很渣,就不解释了:
    [PHP] 纯文本查看 复制代码
    <?php
    //密文
    $f='pTjMwJ9WiQHfvC+eFCFKTBpWQtmgjopgqtmPjfKfjSmdFLpeFf/Aj2ud3tN7u2+enC9+nLN8kgdWo29ZnCrOFCDdFCrOFoF=';
    //明文base64后
    $x='YXNobGtqIUBzajEyMjMlXiYqU2Q0NTY0c2Q4NzlzNWQxMmYyMzFhNDZxd2prZDEySjtESmpsO0xqTDtLSjg3MjkxMjg3MTM=';
    //flag 每组不一样。。
    $flag="uLdAuO8duojAFLEKjIgdpfGeZoELjJp9kSieuIsAjJ/LpSXDuCGduouz"; 
    $new="";
    $temp=[];
    //得到已知对应关系
    for ($i=0;$i<strlen($f);$i++){
            $temp[$f[$i]]=$x[$i];
    }
    
    uksort($temp,function($a,$b){
            return ord($b)>ord($a);
    });
    
    //已确定的
    $temp["z"] ="9" ;
    $temp["I"] ="C" ;
    $temp["G"] ="A" ;
    $temp["s"] ="1" ;
    
    //要猜解的
    /*
    $temp["E"] ="J" ;
    $temp["X"] ="R" ;
    $temp["X"] ="V" ;
    
    $temp["E"] ="R" ;
    $temp["X"] ="J" ;
    $temp["X"] ="V" ;
    */
    #$temp["E"] ="V" ;
    //$temp["X"] ="J" ;
    #$temp["X"] ="R" ;
    //已知对应关系
    print_r($temp);
    for($f=0;$f<strlen($flag);$f++  ){
            if(in_array($flag[$f],array_keys($temp))) {
                    $new.=$temp[$flag[$f]] ;
            }else{
                    $new.="*";
            }
    }
    $all=str_split("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
    //
    $diff=array_diff( $all, array_values($temp)  );
    
    //未知对应字典集合
    print_r($diff);
    $zz=["Mm*l", "N*0x" ,"Yz*y","LT*m",        "ZC*h","YW*k","Zj*x",'ZTZ*'];
    
    //未知项猜解
    foreach($diff as $v){
            foreach($zz as $vv){
                    $res=base64_decode(str_ireplace("*",$v,$vv));
                    //解出的为3位:0-9  a-f - 则为可能项
                    if(preg_match('/^[0-9a-f}-]{3}$/',$res) ){
                            print_r("   $vv   [$v]   $res  \n");
                    }        
            }
    }
    
    echo $new."\n";
    echo base64_decode($new);




    上一篇:一个fofa的api查询工具
    下一篇:Discuz!x3.4 后台修改UCenter配置getshell
    回复

    使用道具 举报

    游客
    回复
    您需要登录后才可以回帖 登录 | 获取账号

    快速回复 返回顶部 返回列表