Zabawa w kotka i myszkę z fotka.pl

30 stycznia 2008

glosowanie_fotkapl.jpg

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:

CODE:
  1. 39      pushstring      "&pktt="
  2. 42      add
  3. 43      findpropstrict  calcMD5
  4. 45      findpropstrict  calcMD5
  5. 47      pushstring      ""
  6. 49      getlex          glos
  7. 51      getproperty     userID
  8. 53      add
  9. 54      pushstring      ""
  10. 56      add
  11. 57      getlex          glos
  12. 59      getproperty     profilID
  13. 61      add
  14. 62      pushstring      ""
  15. 64      add
  16. 65      getlocal1
  17. 66      add
  18. 67      pushstring      ":;^,.^,."
  19. 70      add
  20. 71      callproperty    calcMD5 (1)
  21. 74      callproperty    calcMD5 (1)

Nie będę teraz tłumaczył linijka po linijce tylko zaprezentuję kod PHP odpowiedzialny za prawidłowe kodowanie zmiennej pktt:

PHP:
  1. <?php
  2. $userID=12345;
  3. $profilID=54321;
  4. $glos=10;
  5. $tmp=':;^,.^,.';
  6.  
  7. $pktt=md5(md5($userID.$profilID.$glos.$tmp));
  8. ?>

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 :D

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 :D
  • 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 :P Tylko jedno mi jeszcze chodzi po głowie...

Skąd Wy do cholery wiecie jaką ocenę ktoś wystawił? :P 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 :P 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ć... :)

Dodaj komentarz

8 odpowiedzi dla tego wpisu

  1. mars napisał:

    Poza powyzszym przydatne jest:
    http://www.anotherbigidea.com/.....tions.html

    Oprocz obfuscatorow sa tez encryptory flasha.
    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 :) Lub http://research.microsoft.com/asirra/ :) )

    Co do oceny chyba masz racje, jakas bzdura tu wychodzi.
    pzdr

  2. MariuszT napisał:

    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 :P 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ł.

  3. romek napisał:

    pktt = md5(md5( userID + profiiID + 11 + 3514050 + „(},;” ) )

    i po tajemnicy

  4. MariuszT napisał:

    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 :P Tylko trzeba było od razu dodać, że wzór dla oceny „11″ :P

    PS
    Sam doszedłeś czy korzystałeś z moich wskazówek? ;)

  5. romek napisał:

    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#.

  6. MariuszT napisał:

    No to miło słyszeć, że moje wypociny komuś się przydały :)

  7. buc!! napisał:

    skad wziales ta liczbe ?? 3514050

  8. MariuszT napisał:

    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 :)

Odpowiedz



Podobne wpisy: