Skip to content

baby_baby_reverse

Files Provided

A binary main

Approachh

Decompiled the binary online

int32_t main(int32_t argc, char** argv, char** envp)
{
    void* fsbase;
    int64_t rax = *(fsbase + 0x28);
    int64_t var_228;
    __builtin_strcpy(&var_228, "Th1s_1s_th3_k3y");
    printf("Enter flag: ", argv, 0x79336b5f336874);
    char buf[0x208];
    int32_t result;

    if (fgets(&buf, 0x200, __TMC_END__))
    {
        uint64_t var_248_1 = strlen(&buf);

        if (var_248_1 && buf[var_248_1 - 1] == 0xa)
        {
            buf[var_248_1 - 1] = 0;
            var_248_1 -= 1;
        }

        if (var_248_1 == 0x29)
        {
            char var_24b_1 = 1;
            char var_24a_1 = 0;

            for (int64_t i = 0; i < 0x29; i += 1)
                var_24a_1 |= *(i + &encrypted) ^ *(&var_228 + COMBINE(0, i) % 0xf) ^ buf[i];

            char var_24b_2;

            var_24b_2 = var_24a_1 ? 0 : 1;

            if (!var_24b_2)
                puts("Wrong!");
            else
                puts("Correct!");

            result = 0;
        }
        else
        {
            puts("Wrong!");
            result = 0;
        }
    }
    else
    {
        puts("Input error");
        result = 1;
    }

    *(fsbase + 0x28);

    if (rax == *(fsbase + 0x28))
        return result;

    __stack_chk_fail();
    /* no return */
}

Find the address of encrypted:

readelf -sW main | grep -i encrypted

Solve Script

from pwn import ELF
import sys

binpath = "./main"
e = ELF(binpath)
addr = 0x4060
length = 41
data = e.read(addr, length)
key = b"Th1s_1s_th3_k3y"
flag = bytes([ data[i] ^ key[i % len(key)] for i in range(length) ])
print(flag.decode('utf-8', errors='replace'))