babycryptoweb

60

Can you help me recover the flag?

https://babycryptoweb.challs.fireshellsecurity.team/

提示されたURLを表示すると次のようにPHPのソースコードが表示されます。
<?php
$code '$kkk=5;$s="e1iwZaNolJeuqWiUp6pmo2iZlKKulJqjmKeupalmnmWjVrI=";$s=base64_decode($s);$res="";for($i=0,$j=strlen($s);$i<$j;$i++){$ch=substr($s,$i,1);$kch=substr($kkk,($i%strlen($kkk))-1,1);$ch=chr(ord($ch)+ord($kch));$res.=$ch;};echo $res;';
    
if (isset(
    
if (isset($_GET['p']) && isset($_GET['b']) && strlen($_GET['b']) === && is_numeric($_GET['p']) && (int) $_GET['p'] < strlen($code)) {
    
    $p = (int) $_GET['p'];
    
    $code[$p] = $_GET['b'];
    eval(
    eval($code);
} else {
    
} else {
    show_source(__FILE__);
}

}
?>    
パラメータとしてpとbを必要とします。pは数字で$codeの文字列長より小さい値、bは1文字である必要があります。$codeのpで指定された位置の文字をbで指定した文字で置き換えてeval関数で実行します。
$codeを読みやすく記述すると次のようになります。
$code = '
$kkk=5;
$s="e1iwZaNolJeuqWiUp6pmo2iZlKKulJqjmKeupalmnmWjVrI=";
$s=base64_decode($s);
$res="";
for($i=0, $j=strlen($s); $i < $j; $i++)
{
$ch=substr($s,$i,1);
$kch=substr($kkk,($i % strlen($kkk)) - 1, 1);
$ch=chr(ord($ch)+ord($kch));
$res.=$ch;
};
echo $res;
';
上記の「+」を「-」に置き換えてみます。
pに201、bに-を指定してアクセスするとフラグが表示されます。
フラグは、
F#{0n3_byt3_ru1n3d_my_encrypt1i0n!}
です。