Escritura de PHP_encrypt_1 (ISCCCTF)

https://ctf.bugku.com/

Inserte la descripción de la imagen aquí
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:
Inserte la descripción de la imagen aquí

2. $strAntes 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:

  1. $ 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).
  2. $ char
  3. chr (): convierte un código asill en caracteres
  4. ord (): convierte caracteres en códigos ascii
  5. %: Recordatorio
  6. $ 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 $strcomoc

(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:

  1. Cifrado MD5 de ISCC
 $key = md5('ISCC');
  1. 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);
  1. 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;
?>

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_41924764/article/details/109404236
Recomendado
Clasificación