题目:张三发现一个很像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=
对比很容易发现,相同字符位完全一一对应,见下图:
其它字符也都是一一对应关系,由此我们只需要将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 |