26 stycznia 2014

[BlackHat] Karsten Nohl - Rooting Sim Cards (USA 2013)

Kolejny bardzo udany wykład, Karsten Nohl na temat przełamywania zabezpieczeń w sieciach telekomunikacyjnych. Tym razem na temat rootowania kard SIM:
Operator ma możliwość instalowania na naszej karcie SIM, swojego oprogramowania np. preferowanych operatorów wykorzystywanych podczas roamingu. Instalacja odbywa się przez wysłanie binarnej wiadomości SMS (specjalny rodzaj - identyfikowany przez odpowiedni nagłówek), z komendą/aplikacją podpisaną (DES/3DES/AES) przez operatora. Taki sam klucz (wgrany kiedyś przez operatora na kartę) używany jest do stworzenia podpisanej odpowiedzi. Odpowiedzią, może być error informujący o źle podpisanej pierwotnej wiadomości. Odpowiedź (i czy w ogóle jest) zależy od telefonu i wynika najpewniej z różnej interpretacji standardu. Nohl-owi udało się złamać taki klucz (DES), tworząc tęczową tablicę.
Wgranie własnej aplikacji, niesie ciekawe perspektywy, np. pełne sklonowanie karty. Jak twierdzi Nohl, można ominąć sandbox - przynajmniej w dwóch popularnych implementacjach Java Card VM. Podatności jest ponoć dużo więcej i są dość proste do znalezienia, ale szczegóły zachował dla siebie.

25 stycznia 2014

[CERN] ROOT library - instalacja

Pierwsze podejście do biblioteki ROOT tworzonej przez CERN, z myślą o fizykach. Opowiadał o niej Vassil Vassilev na konferencji C++Now, kiedyś już podsyłałem linka: Interactive, Introspected C++ at CERN. Niestety nie znalazłem paczki, z której mógłbym sobie to zainstalować więc pozostała metoda ręcznej kompilacji. ROOT oferuje kilka ścieżek, na razie wybrałem najbardziej leniwą. Celem, jest odpalenie najprostszego przykładu. Linki:
Konfiguracja wymogła na mnie doinstalowania dwóch paczek: libxpm-dev oraz libxft-dev. Dla około 400 MB kodu, kompilacja trwała jakieś 3.5 godziny. Budowanie:
$ git clone http://root.cern.ch/git/root.git
$ cd root
$ ./configure
$ make

   ============================================================
   ===                ROOT BUILD SUCCESSFUL.                ===
   === Run 'source bin/thisroot.[c]sh' before starting ROOT ===
   ============================================================

# Następnie trzeba wykonać skrypt, który ustawi ścieżki do 
# plików wykonywalnych (PATH) i biblioteki (LD_LIBRARY_PATH)
$ source ./bin/thisroot.sh
Teraz zostajemy zachęceni do wykonania komendy "root", która uruchamia interpreter cling-a.
cling C/C++ Interpreter: type .? for help.
root [0] printf("Hello World!\n");
Hello World!
root [1] 

18 stycznia 2014

[python] doctest

doctest jest modułem dodanym do standardowej biblioteki Python-a, umożliwiający testowanie wyjścia z interpretera. Testy ujęte są w docstring, wejście (action) rozpoznawane jest po >>>, tak jak to wygląda w interpreterze, następna linia jest oczekiwanym wynikiem. Domyślnie, dostest informuje jedynie o porażkach (można to jednak zmodyfikować).
import doctest

def fun():
    '''
    # Testing sorted()
    >>> sorted([1, 3, 2])
    [1, 2, 3]

    # Testing max()
    >>> max(1, 2)
    1
    '''
    pass

doctest.testmod()
Wynik:
Failed example:
    max(1, 2)
Expected:
    1
Got:
    2
**********************************************************************
1 items had failures:
   1 of   2 in __main__.fun
***Test Failed*** 1 failures.

11 stycznia 2014

[python] Wykrajanie sekwencji

Wykrajanie (slice) sekwencji:
#
# s[i:j:k] -> wycinek s od i do j - [i, j) - z krokiem k
#
s = [0, 1, 2, 3, 4]

# stwórz sekwencje z elementów o indeksach [i, j), i <= j
print s[1:3]
print s[1:1] # [i, i) -> zbiór pusty
[1, 2]
[]

# jeżeli i jest pominięte lub równe None, przyjmij że jest równe 0
print s[:2] # s[0:2]
[0, 1]

# jeżeli j jest pominięte lub równe None, przyjmij że jest równe len(s)
print s[2:]
[2, 3, 4]

# jeżeli i lub j jest większe od len(s), użyj len(s)
print s[2:800]
[2, 3, 4]

# dla i, j negatywnych, oblicz nowe i := len(s) + i albo j := len(s) + j
print s[-1]
print s[-1:1] # odpowiednik s[4, 1], ponieważ i > j dostaniemy zbiór pusty
4
[]

# wybierz co k-ty element (i, i+k, i+2*k, ...) z sekwencji pomiędzy indeksami [i, j)
print s[0:4:2]
print s[::2]   # s[0:len(s):2] -> s[0:4:2]
[0, 2]
[0, 2, 4]

# jeżeli i lub j są pominięte stają się wartościami końcowymi ("end"), to jaka to
# wartość końcowa, zależy od znaku k
# dla k < 0, sekwencja będzie odwrócona, czyli s' := [4, 3, 2, 1, 0]
print s[::-1]  # odpowiednik -> s'[0:len(s):-1]
print s[::-2]  # odpowiednik -> s'[0:len(s):-1]
print s[:2:-1] # odpowiednik -> s'[0:2:-1]
[4, 3, 2, 1, 0]
[4, 2, 0]
[4, 3]

# k nie może być równe 0
print s[1:4:0] # Wyjątek!
ValueError: slice step cannot be zero