Zabawa w kotka i myszkę z fotka.pl
30 stycznia 2008

W niedzielę we wpisie Fotka.pl poddała się napisałem instrukcję w jaki sposób odszyfrować tajemniczą zmienną pktt. A jest to potrzebne do napisania programu automatycznie wystawiającego oceny do zdjęć w portalu fotka.pl. I już we wtorek otrzymałem informację, że sposób kodowania pktt został zmieniony. Biorąc pod uwagę tak krótki czas między jednym a drugim wydarzeniem śmiem twierdzić, że mam w tym wszystkim swoją zasługę
Niestety zadziałało to na mnie jak płachta na byka i szybko zabrałem się ponownie za pracę
Skoro zmienił się sposób działania pliku swf to chyba bez najmniejszej szkody dla nikogo mogę dokładnie wytłumaczyć jak to działało wcześniej. Poprzednim razem doszliśmy do tego pliku. Pisałem, że ważnych jest tam tylko kilka linijek.
Oto one:
-
39 pushstring "&pktt="
-
42 add
-
43 findpropstrict calcMD5
-
45 findpropstrict calcMD5
-
47 pushstring ""
-
49 getlex glos
-
51 getproperty userID
-
53 add
-
54 pushstring ""
-
56 add
-
57 getlex glos
-
59 getproperty profilID
-
61 add
-
62 pushstring ""
-
64 add
-
65 getlocal1
-
66 add
-
67 pushstring ":;^,.^,."
-
70 add
-
71 callproperty calcMD5 (1)
-
74 callproperty calcMD5 (1)
Nie będę teraz tłumaczył linijka po linijce tylko zaprezentuję kod PHP odpowiedzialny za prawidłowe kodowanie zmiennej pktt:
I to tyle
W ten prosty sposób otrzymujemy wartość pktt.
Jednak chłopaki z fotka.pl wzięli się do pracy i zmienili całego flasha. Jego nowy adres to http://s4.fotka.pl/img/swf/g12.swf a po skorzystaniu z programu opisywanego przeze mnie we wcześniej wspomnianym wpisie dostajemy to.
Zmian jest sporo. Przede wszystkim wygląda mi to na zmianę kodu odpowiedzialnego za działanie md5. To było dla mnie akurat ułatwienie
Znalazłem to i posłużył mi ten kod jako wzorzec. Porównywałem Action Script z naszym zdekompilowanym kodem i w ten sposób mogłem w prosty sposób rozeznać się co oznaczają i jak działają poszczególne komendy w pliku g12.swf.il. Oczywiście mogłem tak działać już wcześniej, napisać jakiś kod w AS i zapisać jako swf a potem użyć naszego kochanego programiku ale problem w tym, że nawet nie mam zainstalowanego Flasha
No dobrze ale wróćmy do sedna sprawy. Zawiodłem się troszeczkę na tym kodzie
Tworzyłem jakieś teorie spiskowe, miałem różne dziwne pomysły co programiści mogli zmienić w AS żeby utrudnić mi życie a tu się okazało, że całe zabezpieczenie to aż... zwykłe mnożenie
Całego rozwiązania oczywiście nie podam, podpowiem tylko, że tajemnicza zmienna z którą jest najwięcej pracy ma wartość 3514050
Obawiam się, że ciągłe zmienianie flasha to tak naprawdę walka z wiatrakami. Zawsze znajdzie się ktoś uparty
Z drugiej strony regularne zmiany zniechęcą ludzi do zabawy z tym bo po co się męczyć skoro za dwa tygodnie problem wróci. Tak czy owak mam kilka rad:
- Panowie, co to za zabezpieczenie gdzie jest tylko jedna niewiadoma i to liczbowa? Przecież na upartego mogłem zrobić pętlę gdzieś tak do stu milionów i podstawiać kolejne liczby a wynik porównywać z prawidłowym hashem. Po kilku(nastu) minutach miałbym rozwiązanie i nawet bym się nie musiał zastanawiać jak to jest liczone.
- Stwórzcie kilka niewiadomych plus kilka funkcji operujących na nich. I niech tam będzie jakieś potęgowanie, pierwiastkowanie, sinusy, cosinusy i jeszcze cholera wie co. Oczywiście idzie rozkodować wszystko ale komu się będzie chciało tyle siedzieć przed monitorem dla jakiegoś głupiego głosowania? Jeżeli nie chcecie dodatkowo obciążać serwerów jakimiś zmyślnymi algorytmami (bo swf działa po stronie klienta ale na serwerze obliczenia na pewno powtarzacie żeby porównać dwa stringi) to dodajcie jakieś funkcje, które najpierw przeprowadzą obliczenia na jakiejś niewiadomej a potem w sprytny sposób je cofną i wszystko wróci do wartości bazowej. Ktoś może na to nie wpaść i zakopie się w obliczeniach
Zastanówcie się nad tym bo ja tego nie zrobiłem i może się okazać, że piszę głupoty
- Pomyślcie nad jakimś obfuscatorem. Słyszałem, że to potrafi nieźle zakręcić i utrudnić sprawę. To się przyda bo lada chwila ukaże się publicznie jakiś dekompilator kodu AS3 i żadne złożone obliczenia nie pomogą gdy dostanie się do ręki ładnie sformatowany kodzik AS.
Nic więcej nie przychodzi mi na razie do głowy. Ja dalsze zabawy sobie raczej odpuszczę bo mam masę innych zajęć a tu bawię się jakimiś pierdołami
Tylko jedno mi jeszcze chodzi po głowie...
Skąd Wy do cholery wiecie jaką ocenę ktoś wystawił?
Przekazujecie userID jako osobną zmienną więc tu nie ma problemu. ProfilID pewnie odczytujecie z sesji. A gdzie jest oddany głos? Chyba nie chcecie mi powiedzieć, że robicie pętlę od 1 do 11 (chociaż pewnie więcej jest wystawianych tych wysokich ocen więc bardziej się opłaca od 11 do 1
), kodujecie wszystko dla podstawionych głosów i porównujecie z wysłaną zmienną pktt? To byłoby niepotrzebne marnotrawstwo zasobów
Lepiej ocenę jaka jest wystawiana przesyłać tak jak przesyłacie userID i pktt liczyć tylko raz na serwerze. No chyba, że ja o czymś nie pomyślałem i plotę głupoty
Właściwie to nawet nie bardzo chce mi się w to zagłębiać...
Blog przede wszystkim o Internecie i mojej pasji jaką jest tworzenie stron www. Ale nie ograniczam się do jednej tematyki, piszę o wszystkim o czym mam ochotę :-)
mars napisał: 31.01.08 o godzinie 8:00
Poza powyzszym przydatne jest:
http://www.anotherbigidea.com/.....tions.html
Oprocz obfuscatorow sa tez encryptory flasha.
Lub http://research.microsoft.com/asirra/
)
wiecej tu:
http://www.gotoandplay.it/_art.....ection.php
W koncu prosto to wszystko mozna ograniczyc przez CAPTCH’e przy glosowaniu, tylko taka jak np w google, a nie jakies badziewie, ktore mozna odczytac roznymi technikami OCR
Co do oceny chyba masz racje, jakas bzdura tu wychodzi.
pzdr
MariuszT napisał: 31.01.08 o godzinie 11:05
Pierwszy adres bardzo pomocny
Piękna instrukcja do wszystkich komend
Tak, prawda, są jeszcze encryptory. Zapomniałem o tym.
Co do captcha czy innych tego typu rozwiązań to byłoby to samobójstwo
Przecież fotka nie może czegoś takiego wprowadzać przy głupim głosowaniu… Jakieś zabezpieczenie można wstawić przy logowaniu ale to też nic nie da bo żaden problem wyciągnąć ze strony zabezpieczenie i samemu ręcznie się zalogować a potem automat już sam będzie głosował.
romek napisał: 01.02.08 o godzinie 23:12
pktt = md5(md5( userID + profiiID + 11 + 3514050 + „(},;” ) )
i po tajemnicy
MariuszT napisał: 01.02.08 o godzinie 23:42
Nie napisałeś w jakim języku programowania podajesz rozwiązanie. To może wprowadzać niektórych w błąd z powodu różnic w sposobie łączenia stringów w różnych językach :] A tak w ogóle to nie wiem czy dobrze robisz podając rozwiązanie ale co tam, ja mam czyste sumienie
Tylko trzeba było od razu dodać, że wzór dla oceny „11″
PS
Sam doszedłeś czy korzystałeś z moich wskazówek?
romek napisał: 02.02.08 o godzinie 18:02
powiem szczerze że bez Twoich wskazówek dotyczących uzyskania kodu il bym sobie nie poradził, liczba 3514050 się przydała ale rzeczywiście masz rację słabe zabezpieczenia, zwykle mnożenie, a kod jest wycięty z c#.
MariuszT napisał: 02.02.08 o godzinie 18:57
No to miło słyszeć, że moje wypociny komuś się przydały
buc!! napisał: 16.02.08 o godzinie 23:28
skad wziales ta liczbe ?? 3514050
MariuszT napisał: 17.02.08 o godzinie 10:16
findproperty count
pushshort 7398
initproperty count
findproperty count
getlex count
pushshort 475
multiply
initproperty count
Czyli…
count=7398
count*=475
wynik mnożenia=3514050
Trzeba wiedzieć gdzie i czego szukać oraz co oznaczają poszczególne polecenia