Symbolic Execution
Cheezing
Example 1 : Cracking a relatively simple binary
undefined8 main(void)
{
int iVar1;
size_t sVar2;
long counter;
undefined4 *encrypted_flag;
char local_108 [256];
puts("Welcome to CTFd+!");
puts(
"So far, we only have one challenge, which is one more than the number of databases we have.\n"
);
puts("Very Doable Pwn - 500 points, 0 solves");
puts("Can you help me pwn this program?");
puts("#include <stdio.h>\nint main(void) {\n puts(\" Bye!\");\n return 0;\n}\n");
puts("Enter the flag:");
fgets(local_108,256,stdin);
sVar2 = strcspn(local_108,"\n");
counter = 0;
encrypted_flag = &DAT_00104060;
local_108[sVar2] = '\0';
do {
iVar1 = FUN_00101230(encrypted_flag[counter]);
if ((char)iVar1 != local_108[counter]) {
puts("Incorrect flag.");
return 0;
}
counter = counter + 1;
} while (counter != 0x2f);
# Flag
puts("You got the flag! Unfortunately we don\'t exactl y have a database to store the solve in...")
;
return 0;
}
We know that our flag is 0x2f in size, and definitely performs a series of XOR operations (via FUN_00101230) on the encrypted_flag to compare it against our input.
We can just specify our bad and good addresses in respect to disassembly in Ghidra.
Last updated