La cadena encriptada:
fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA =
Dirección de descarga del título:
https://ctf.bugku.com/files/6b8e8eb682d757d851cd5dcdca349668/PHP_encrypt_1.zip
Después de descargar el zip, obtenga el siguiente código y analícelo:
<?php
function encrypt($data,$key)
{
$key = md5('ISCC');
$x = 0;
$len = strlen($data);
$klen = strlen($key);
for ($i=0; $i < $len; $i++) {
if ($x == $klen)
{
$x = 0;
}
$char .= $key[$x];
$x+=1;
}
for ($i=0; $i < $len; $i++) {
$str .= chr((ord($data[$i]) + ord($char[$i])) % 128);
}
return base64_encode($str);
}
?>
Análisis inverso del script:
1. Analice de atrás hacia adelante, $ str se ha sometido a un cifrado base64. Primero usamos la función de decodificación para descifrar:
<?php
echo base64_decode("fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=");
?>
Obtenga la cadena descifrada en base64:
2. $str
Antes de que se genere la variable, pasa por un ciclo for:
for ($i=0; $i < $len; $i++) {
$str .= chr((ord($data[$i]) + ord($char[$i])) % 128);
}
Varias funciones y variables en el bucle for:
- $ len = la longitud de la cadena $ data (la longitud de la cadena de $ data es la longitud de la cadena después del descifrado base64, que es la misma que la longitud de la bandera original y no ha cambiado).
- $ char
- chr (): convierte un código asill en caracteres
- ord (): convierte caracteres en códigos ascii
- %: Recordatorio
- $ data: es la bandera original
La cadena de la bandera original se agrega al código ascii correspondiente a la variable char, y el código ascii después de 128 se convierte en un carácter y se empalma en $ str.
Análisis de fórmulas de cifrado:
(Soy pobre en matemáticas ... estoy tratando de compensarlo)
El ord($data[$i])
como a
voluntad ord($char[$i]
como b
voluntad $str
comoc
(a+b)%128=c
Fórmula de descifrado:
如果 b+c<=128
解: a=128+c-b
如果 b+c>128
解:如果(c-b)大于128
a=c-b-128
如果不大于128
a=c-b
3. Después de analizar el método de encriptación en el ciclo for, necesitamos conocer el contenido de la variable $ char y continuar analizando el ciclo for anterior.
$key = md5('ISCC');
$x = 0;
$len = strlen($data);
$klen = strlen($key);
for ($i=0; $i < $len; $i++) {
if ($x == $klen)
{
$x = 0;
}
$char .= $key[$x];
$x+=1;
}
función:
- md5 (): MD5 cifra la cadena
- strlen (): obtiene la longitud de la cadena
Análisis de código:
- Cifrado MD5 de ISCC
$key = md5('ISCC');
- Calculando la longitud de la cadena $ datos asignados a $ len, calculada $ clave asignada a la longitud de la cadena $ klen,
variable de longitud de la cadena len después de nuestra anterior como una
variable Klen de descifrado base64 es igual a 32 (porque la longitud es un cifrado de 32 bits md5)
$len = strlen($data);
$klen = strlen($key);
- El ciclo for se ejecuta para calcular el valor de $ char
for ($i=0; $i < $len; $i++) {
#for循环$len次
if ($x == $klen)#如果$x等于32,那么$x将等于0
{
$x = 0;
}
$char .= $key[$x];#char: 如果$data长度为10,那么会将$key的前10位赋值给$char
$x+=1;
}
Después de analizar el valor del código de $ char, puede usar la 余求值
fórmula de descifrado anterior para resolver el valor de los datos (bandera).
<?php
$str= base64_decode("fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=");
$key = md5('ISCC');
$x = 0;
$len = strlen($str);
$klen = strlen($key);
for ($i=0; $i < $len; $i++) {
if ($x == $klen)
{
$x = 0;
}
$char .= $key[$x];
$x+=1;
}
for ($i=0; $i < $len; $i++) {
if (ord($char["$i"])+ord($str["$i"])<=128)
{
$data.=chr(128+ord($str["$i"])-ord($char["$i"]));
}else{
$data1=chr(ord($str["$i"])-ord($char["$i"]));
if (ord($data1) >128 ){
$data.=chr(ord($data1)-128);
}else{
$data.=$data1;
}
}
}
echo $data;
?>