Для прохождения лабы нужно подобрать код, который пройдет валидацию.

Solution

Начну с анализа функции main:

int32_t main(int32_t argc, char** argv, char** envp)
{
    void* const __return_addr_1 = __return_addr;
    int32_t* var_c = &argc;
    printf("This is secure app, you need pas…");
    void var_11f;
    scanf(&data_8048654, &var_11f);
    size_t eax = strlen(&var_11f);
    uint32_t var_14 = 0x75;
    
    for (int32_t i = 0; i < eax; i += 1)
    {
        char eax_9;
        int32_t edx_1;
        edx_1 = HIGHD(((int64_t)(var_14 * (((int32_t)*(uint8_t*)(i + &var_11f)) + 1))));
        eax_9 = LOWD(((int64_t)(var_14 * (((int32_t)*(uint8_t*)(i + &var_11f)) + 1))));
        uint32_t edx_2 = (edx_1 >> 0x18);
        var_14 = (((uint32_t)(eax_9 + edx_2)) - edx_2);
    }
    
    if (var_14 != 0x76)
        puts("Go out of here!");
    else
        puts("You are welcome! Now you can use…");
    
    return 0;
}

Мда уж. Выглядит не очень. Есть два пути упростить данный код: разбирать ассемблер или… закинуть в другую тулу и глянуть там. Конечно же начну со второго варианта)

IMG

Так-то лучше. А почему сразу не использовать эту тулу? - спросите вы. А я отвечу: “Периодически оно работает и в другую сторону.”

Код стал сильно понятнее. Руками перебирать пароли я не хочу, поэтому напишу скрипт на питоне:

def check(nums) -> int:
    start = 117

    res = start
    for n in nums:
        res = (res * (n + 1)) % 256
    return res


if __name__ == '__main__':
    target = 118

    ans = [32]
    while check(ans) != 118:
        carry = 1
        for i in range(len(ans)):
            if carry == 1:
                ans[i] += 1
                carry = 0

            if ans[i] == 128:
                ans[i] = 32
                carry = 1
        if carry == 1:
            ans.append(32)

    print(''.join([chr(c) for c in ans]))
cu63:Nostr 3/ $ python solver.py                                                                           
~!

О как. Отличный код. Попробую его ввести на сайте:

IMG