PRÁCTICA-INVERSA-BUUCTF-10

[GWCTF 2019] xxor

archivo elf, sin shell,
lógica clara de analizar la función principal con ida , primero obtenga la entrada, que son 6 valores int64, luego cada 2 valores se establecen, llame a la función sub_400686 para transformar, el valor transformado se almacena en v11, y finalmente verificado v11, verificar la
xxor-lógica
función de entrada sub_400686, leer los 2 valores de cada grupo, realizar 64 ciclos y volver a poner el valor transformado en la posición original. La
xxor-sub_400686
función check se puede utilizar para obtener los 6 valores que deben cambiarse después de que se transforme la entrada.
xxor-comprobar
Escriba un script inverso, los 6 valores de v11 se pueden calcular manualmente o usando la biblioteca z3 de python para calcular el
tipo v5 como int32, el valor inicial es 0, 64 adiciones deben exceder el máximo valor positivo de int32, pero será interceptado automáticamente durante el proceso de cálculo, por lo que no hay necesidad de especial Considere v5, simplemente escriba el script normalmente

#include<stdio.h>
__int64 v11[] = {
    
     0xdf48ef7e,0x20caacf4,0xe0f30fd5,
					0x5c50d8d6,0x9e1bde2d,0x84f30420 };
__int64 a2[] = {
    
     2,2,3,4 };
void main()
{
    
    
	for (int i = 0; i <= 4; i += 2)
	{
    
    
		unsigned int v3 = v11[i];
		unsigned int v4 = v11[i + 1];
		int v5 = 0;
		for (int j = 0; j <= 63; j++)
			v5 += 1166789954;
		for (int j = 0; j <= 63; j++)
		{
    
    
			v4-= (v3 + v5 + 20) ^ ((v3 << 6) + a2[2]) ^ ((v3 >> 9) + a2[3]) ^ 0x10;
			v3-= (v4 + v5 + 11) ^ ((v4 << 6) + a2[0]) ^ ((v4 >> 9) + a2[1]) ^ 0x20;
			v5 -= 1166789954;
		}
		if (v5 == 0)
		{
    
    
			v11[i] = v3;
			v11[i + 1] = v4;
		}
	}
	for (int i = 0; i < 6; i++)
	{
    
    
		printf("%ld,", v11[i]);
	}
}

Ejecute el resultado y
xxor-script
luego use long_to_bytes de python para convertir en una cadena
bandera-xxor

[HDCTF2019] Laberinto

exe, después de ejecutarse, solicita que la bandera atraviese el laberinto, hay un shell upx, después de que ida analiza la
función principal no es reconocida como una función por ida, la razón es que la instrucción de la flor
jnz se agrega al código para saltar a la siguiente instrucción. Una instrucción, donde jnz dificulta el reconocimiento de ida, necesita nop toda la instrucción de
jnz. En el texto: 0040102E, se llama a una dirección roja, lo que indica que la dirección roja no existe en el programa , debe estar en el byte de instrucción correcto Basado en la adición de unos pocos bytes, se vuelve irreconocible por ida, por lo que debe eliminar los bytes adicionales, seleccionar la dirección roja, presionar d para convertir a datos, y luego nop y soltar algunos bytes para ver si ida puede ser capaz de eliminar los bytes después de nop. Reconocido como código, y descubrió que después de convertir a datos, nop descarta el primer byte e ida puede reconocer el
laberinto-falso
efecto de eliminar la instrucción de la flor.
maze-removefakeorder
Seleccione el texto rojo. codifique desde el principio de la función principal hasta el final de la instrucción retn, y presione p para generar la función. F5 descompilación
Analice la función principal, wsad corresponde a la parte superior, inferior, izquierda y derecha, la posición inicial es [7 , 0], y la posición final es [5, -4].
laberinto principal
Encuentra el mapa del laberinto en la ventana de la cadena, la longitud es 70 y la suposición es 10x7 o 7x10. La posición inicial y la posición final se pueden conocer, el El mapa es de 7x10, es decir, 7 filas y 10 columnas, el punto de inicio está en "+" y el punto final está en "F". Puedes obtener la bandera después de caminar por el laberinto.
laberinto-bandera

[WUSTCTF2020] nivel 2

archivo elf, con shell upx, análisis ida después del bombardeo.
Busque la función principal en la ventana de funciones de la izquierda y podrá ver la bandera en la ventana IDA View-A
level2-flag

[BJDCTF2020] Concurso de hamburguesas BJD

El juego Unity, la vieja hamburguesa pequeña secreta de ocho,
agrega los ingredientes en el orden correcto para obtener la bandera BJD hamburger competition_Data-> Managed-> Assembly-CSharp.dll arrastre a dnSpy para
encontrar la parte de la lógica principal. El
método Md5 md5 los parámetros entrantes. La columna, en mayúsculas, toma los primeros 20 dígitos. El
método Sha1 realiza el hash sha1 en los parámetros entrantes. El
método Spawn en mayúsculas verifica el orden de alimentación. Se seleccionan diferentes ingredientes para realizar diferentes operaciones en Init.secret (el valor inicial es 0). El resultado del hash sha1 se compara con el valor conocido, cuando es el mismo, el programa hash el resultado de la operación md5 y lo muestra como bandera

using System;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;

// Token: 0x02000004 RID: 4
public class ButtonSpawnFruit : MonoBehaviour
{
    
    
	// Token: 0x0600000A RID: 10 RVA: 0x00002110 File Offset: 0x00000310
	public static string Md5(string str)
	{
    
    
		byte[] bytes = Encoding.UTF8.GetBytes(str);
		byte[] array = MD5.Create().ComputeHash(bytes);
		StringBuilder stringBuilder = new StringBuilder();
		foreach (byte b in array)
		{
    
    
			stringBuilder.Append(b.ToString("X2"));
		}
		return stringBuilder.ToString().Substring(0, 20);
	}

	// Token: 0x0600000B RID: 11 RVA: 0x00002170 File Offset: 0x00000370
	public static string Sha1(string str)
	{
    
    
		byte[] bytes = Encoding.UTF8.GetBytes(str);
		byte[] array = SHA1.Create().ComputeHash(bytes);
		StringBuilder stringBuilder = new StringBuilder();
		foreach (byte b in array)
		{
    
    
			stringBuilder.Append(b.ToString("X2"));
		}
		return stringBuilder.ToString();
	}

	// Token: 0x0600000C RID: 12 RVA: 0x000021C8 File Offset: 0x000003C8
	public void Spawn()
	{
    
    
		FruitSpawner component = GameObject.FindWithTag("GameController").GetComponent<FruitSpawner>();
		if (component)
		{
    
    
			if (this.audioSources.Length != 0)
			{
    
    
				this.audioSources[Random.Range(0, this.audioSources.Length)].Play();
			}
			component.Spawn(this.toSpawn);
			string name = this.toSpawn.name;
			if (name == "汉堡底" && Init.spawnCount == 0)
			{
    
    
				Init.secret += 997;
			}
			else if (name == "鸭屁股")
			{
    
    
				Init.secret -= 127;
			}
			else if (name == "胡罗贝")
			{
    
    
				Init.secret *= 3;
			}
			else if (name == "臭豆腐")
			{
    
    
				Init.secret ^= 18;
			}
			else if (name == "俘虏")
			{
    
    
				Init.secret += 29;
			}
			else if (name == "白拆")
			{
    
    
				Init.secret -= 47;
			}
			else if (name == "美汁汁")
			{
    
    
				Init.secret *= 5;
			}
			else if (name == "柠檬")
			{
    
    
				Init.secret ^= 87;
			}
			else if (name == "汉堡顶" && Init.spawnCount == 5)
			{
    
    
				Init.secret ^= 127;
				string str = Init.secret.ToString();
				if (ButtonSpawnFruit.Sha1(str) == "DD01903921EA24941C26A48F2CEC24E0BB0E8CC7")
				{
    
    
					this.result = "BJDCTF{" + ButtonSpawnFruit.Md5(str) + "}";
					Debug.Log(this.result);
				}
			}
			Init.spawnCount++;
			Debug.Log(Init.secret);
			Debug.Log(Init.spawnCount);
		}
	}

	// Token: 0x04000005 RID: 5
	public GameObject toSpawn;

	// Token: 0x04000006 RID: 6
	public int spawnCount = 1;

	// Token: 0x04000007 RID: 7
	public AudioSource[] audioSources;

	// Token: 0x04000008 RID: 8
	public string result = "";
}

Utilice el sitio web en línea para resolver el valor original del sha1 conocido. Si es 1001
bjd-desha1
, md5 el 1001, conviértalo a mayúsculas y tome los primeros 20 dígitos para obtener la bandera.
bandera-bjd
Si no usa el sitio web en línea para resolver los hashes sha1 y md5, escribe un script explosivo

#coding:utf-8
#汉堡底 +=997
#汉堡顶 ^=127
#鸭屁股 -=127  0
#胡罗贝 *=3    1
#臭豆腐 ^=18   2
#俘虏   +=29   3
#白拆   -=47   4
#美汁汁  *=5   5
#柠檬   ^=87   6
import hashlib
#从其他7种材料中选4种 加上汉堡底和汉堡顶 一共6种
for i in range(7):
    for j in range(7):
        for k in range(7):
            for m in range(7):
                    secret=997    #汉堡底当作第一种材料
                    if i==0:
                        secret-=127
                    elif i==1:
                        secret*=3
                    elif i==2:
                        secret^=18
                    elif i==3:
                        secret+=29
                    elif i==4:
                        secret-=47
                    elif i==5:
                        secret*=5
                    elif i==6:
                        secret^=87
                    if j==0:
                        secret-=127
                    elif j==1:
                        secret*=3
                    elif j==2:
                        secret^=18
                    elif j==3:
                        secret+=29
                    elif j==4:
                        secret-=47
                    elif j==5:
                        secret*=5
                    elif j==6:
                        secret^=87
                    if k==0:
                        secret-=127
                    elif k==1:
                        secret*=3
                    elif k==2:
                        secret^=18
                    elif k==3:
                        secret+=29
                    elif k==4:
                        secret-=47
                    elif k==5:
                        secret*=5
                    elif k==6:
                        secret^=87
                    if m == 0:
                        secret -= 127
                    elif m == 1:
                        secret *= 3
                    elif m == 2:
                        secret ^= 18
                    elif m == 3:
                        secret += 29
                    elif m == 4:
                        secret -= 47
                    elif m == 5:
                        secret *= 5
                    elif m == 6:
                        secret ^= 87
                    secret^=127   #最后加汉堡顶的时候,材料的种数还没有加到6
                    h = hashlib.sha1()
                    h.update(str(secret).encode(encoding='utf-8'))
                    #验证sha1散列
                    if h.hexdigest() == "DD01903921EA24941C26A48F2CEC24E0BB0E8CC7".lower():
                        print(secret)
                        #输出md5散列
                        h2 = hashlib.md5()
                        h2.update(str(secret).encode(encoding='utf-8'))
                        print(h2.hexdigest().upper()[0:20])

resultado de la operación
bandera-bjd

Supongo que te gusta

Origin blog.csdn.net/weixin_45582916/article/details/114155833
Recomendado
Clasificación