duze dziwne liczby w petli

0
#include <stdio.h>

int main()
{
	unsigned int flag, x, i;
	printf("Enter flag: ");
	scanf("%u", &flag);
	x = flag;
	for(i = 0; i < 0xdeafbee; i++)
		x = (((((~((((((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))>>14)+((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))<<18))^1271553060)<<28)+(((((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))>>14)+((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))<<18))^1271553060)>>4)))>>26)+((~((((((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))>>14)+((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))<<18))^1271553060)<<28)+(((((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))>>14)+((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))<<18))^1271553060)>>4)))<<6))<<28)+((((~((((((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))>>14)+((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))<<18))^1271553060)<<28)+(((((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))>>14)+((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))<<18))^1271553060)>>4)))>>26)+((~((((((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))>>14)+((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))<<18))^1271553060)<<28)+(((((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))>>14)+((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))<<18))^1271553060)>>4)))<<6))>>4));
	if(x == 0xc9ea542e)
	printf("Flag is: CTF{%x}\n",flag);
	return 0;
}

Witam mam taki oto algorytm powyzej jednak mam problem bo nie wiem co i do czego sa te duze liczby w petli a nie moge znalezc nic o tym w necie a nie pamietam jak to sie fachowo nazywalo. Moze ktos mi to wyjasnic skad sie biora takie liczby itd? Zaznaczam ze to jest algorytm do zadania typu crypto.

6

A co to ma według ciebie robić?

Ta linijka:

x = (((((~((((((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))>>14)+((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))<<18))^1271553060)<<28)+(((((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))>>14)+((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))<<18))^1271553060)>>4)))>>26)+((~((((((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))>>14)+((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))<<18))^1271553060)<<28)+(((((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))>>14)+((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))<<18))^1271553060)>>4)))<<6))<<28)+((((~((((((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))>>14)+((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))<<18))^1271553060)<<28)+(((((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))>>14)+((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))<<18))^1271553060)>>4)))>>26)+((~((((((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))>>14)+((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))<<18))^1271553060)<<28)+(((((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))>>14)+((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))<<18))^1271553060)>>4)))<<6))>>4));

Jest ewidentnie napisana komuś na złość (prawdopodobnie jako kara za lenistwo), żeby nie był jej w stanie przeczytać.
Ja nawet nie będę próbować.

0

To jest jakiś wzór matematyczny - może jakiś wielomian, a te liczby prawdopodobnie są po prostu stałymi dobranymi na potrzeby algorytmu. Nie bardzo wiem jak ktoś tutaj mógłby odpowiedzieć na to pytanie o ile to nie jest jakaś super znana reguła (a wtedy raczej by była w jakiejś funkcji std). To mogło być wygenerowane jakimś zewnętrznym narzędziem i przeklejone/przepisane do kodu

0

Poczytaj sobie o "Operacjach na bitach"
~ tilde - negacja
^ XOR - suma modulo itd.

8

@AnyKtokolwiek: @MarekR22 przecież to standardowe zadanie CTFowe z zakresu inżynierii wstecznej, tylko tutaj ułatwione bo masz kod w C a nie binarkę do zdekompilowania.

@Andrzejch56 można to zrobić na 2 sposoby:

  1. Spróbować to "odwrócić", tzn wyjść od wartości 0xc9ea542e i próbować wykonywać operacje przeciwne od końca
  2. Łatwiejsza opcja, to wrzucić na pałe do Z3 :)
1

W ogólności masz tam wielokrotne wykonanie: (~x)^340771246 - pewnie jakby zredukować to do jednego bitu i podać x które jest zbliżone do 340771246 to łatwiej byłoby to analizować.

Na wejściu masz liczbę kroków:
1101111010101111101111101110

Do znalezienia:
110|01001111010100101010000|101110

1

Stawiam że flaga będzie bardzo leet, nawet podwójnie.
W zasadzie nie trzeba być do tego inteligentnym, starczy 16 GB ramu wolnego.

1

Liczba 0xdeafbee w pętli jest redukowalna, gdyż obliczenia wartości x wpadają w cykle składające się z ̶6̶3̶ 64 wartości.
https://godbolt.org/z/7sE9463cc

3

No i skoro już wiemy że cykl ma 64 to możemy poprosić pana Z3:

def solve():
    s = z3.Solver()
    x = z3.BitVec('flag', 32)
    for i in range(0xdeafbee%64):
        x = (((z3.LShR((~((((z3.LShR((~((((~x) ^ 340771246) << 15) + z3.LShR(((~x) ^ 340771246), 17))), 14) + (
                (~((((~x) ^ 340771246) << 15) + z3.LShR(((~x) ^ 340771246), 17))) << 18)) ^ 1271553060) << 28) + z3.LShR(((z3.LShR((~(
                (((~x) ^ 340771246) << 15) + z3.LShR(((~x) ^ 340771246), 17))), 14) + ((~(
                (((~x) ^ 340771246) << 15) + z3.LShR(((~x) ^ 340771246), 17))) << 18)) ^ 1271553060), 4))), 26) + ((~((((z3.LShR((~(
                (((~x) ^ 340771246) << 15) + z3.LShR(((~x) ^ 340771246), 17))), 14) + ((~(
                (((~x) ^ 340771246) << 15) + z3.LShR(((~x) ^ 340771246), 17))) << 18)) ^ 1271553060) << 28) + z3.LShR(((z3.LShR((~(
                (((~x) ^ 340771246) << 15) + z3.LShR(((~x) ^ 340771246), 17))), 14) + ((~(
                (((~x) ^ 340771246) << 15) + z3.LShR(((~x) ^ 340771246), 17))) << 18)) ^ 1271553060), 4))) << 6)) << 28) + z3.LShR((z3.LShR((~((((z3.LShR((~(
                (((~x) ^ 340771246) << 15) + z3.LShR(((~x) ^ 340771246), 17))), 14) + ((~(
                (((~x) ^ 340771246) << 15) + z3.LShR(((~x) ^ 340771246), 17))) << 18)) ^ 1271553060) << 28) + z3.LShR(((z3.LShR((~(
                (((~x) ^ 340771246) << 15) + z3.LShR(((~x) ^ 340771246), 17))), 14) + ((~(
                (((~x) ^ 340771246) << 15) + z3.LShR(((~x) ^ 340771246), 17))) << 18)) ^ 1271553060), 4))), 26) + ((~((((z3.LShR((~(
                (((~x) ^ 340771246) << 15) + z3.LShR(((~x) ^ 340771246), 17))), 14) + ((~(
                (((~x) ^ 340771246) << 15) + z3.LShR(((~x) ^ 340771246), 17))) << 18)) ^ 1271553060) << 28) + z3.LShR(((z3.LShR((~(
                (((~x) ^ 340771246) << 15) + z3.LShR(((~x) ^ 340771246), 17))), 14) + ((~(
                (((~x) ^ 340771246) << 15) + z3.LShR(((~x) ^ 340771246), 17))) << 18)) ^ 1271553060), 4))) << 6)), 4))
    s.add(x == 0xc9ea542e)
    print(s.check())
    print(s.model())

(trzeba zamienić >> na z3.LShR bo logical i arithmetical shift to nie to samo)

który mówi że 322376503 czyli 0x13371337

4

@Shalom: skoro wiemy że cykl jest długości 64 to wystarczy

x = 0xc9ea542e;
for(i = 0; i < 64 - 0xdeafbee%64; i++)
        x = (((((~((((((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))>>14)+((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))<<18))^1271553060)<<28)+(((((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))>>14)+((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))<<18))^1271553060)>>4)))>>26)+((~((((((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))>>14)+((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))<<18))^1271553060)<<28)+(((((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))>>14)+((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))<<18))^1271553060)>>4)))<<6))<<28)+((((~((((((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))>>14)+((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))<<18))^1271553060)<<28)+(((((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))>>14)+((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))<<18))^1271553060)>>4)))>>26)+((~((((((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))>>14)+((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))<<18))^1271553060)<<28)+(((((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))>>14)+((~((((~x)^340771246)<<15)+(((~x)^340771246)>>17)))<<18))^1271553060)>>4)))<<6))>>4));
0

Hooooop hooop

Pierwotny Pytajacy zaginął, obawiam się, ze nie zauważyliście

0

Tak to jest zadanie CTF od Agencji Wywiadu i nie zaginalem po prostu nie bylo mnie :).

1 użytkowników online, w tym zalogowanych: 0, gości: 1