Для прохождения лабы нужно подобрать код, который пройдет валидацию.
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;
}
Мда уж. Выглядит не очень. Есть два пути упростить данный код: разбирать ассемблер или… закинуть в другую тулу и глянуть там. Конечно же начну со второго варианта)

Так-то лучше. А почему сразу не использовать эту тулу? - спросите вы. А я отвечу: “Периодически оно работает и в другую сторону.”
Код стал сильно понятнее. Руками перебирать пароли я не хочу, поэтому напишу скрипт на питоне:
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
~!
О как. Отличный код. Попробую его ввести на сайте:
