Dzień jak co dzień, siedzicie nad kolejnym 256 bitowym (joke!) kluczem RSA do złamania, msieve męczy długo – co tu zrobić? Ano skorzystać z fabryki faktoryzacji, która obecnie posiada 601,636,809 milionów wyników P*Q (klucz publiczny RSA), więc jest duża szansa, że znajdziecie tam swój wynik prędzej niż korzystając z innych metod.
Reversing
Portable Executable Poster
Projekt mojego starego plakatu prezentującego struktury formatu Portable Executable PE w Microsoft Visio oraz PDF.
Portable-Executable-Poster.zip (139 kB)
Wesołych świąt 🙂
Przegląd narzędzi do reverse engineeringu
Witajcie, właśnie ukazał się nowy numer Magazynu Programista 11/2014, w którym znajdziecie m.in. mój artykuł opisujący najpopularniejsze i te trochę mniej znane narzędzia wykorzystywane w reverse engineeringu, wszystkich zainteresowanych tematem zachęcam do wizyt w Empikach.
Praca w Symantecu
Symantec szuka pracowników do analizy malware, w tym do siedziby w Irlandii (i kilku innych lokalizacji):
https://www.compusecjobs.com/jobs/principle-attack-investigation-engineer/
Październikowa zamuła
Jesień w toku, zimno jak cholera, dlatego kilka ciekawych rzeczy, na które ostatnio natrafiłem.
Mateusz Jurczyk vel j00ru znalazł sporo błędów w IDA, co opisał w swojej prezentacji na:
https://j00ru.vexillium.org/?p=2454
Na blogu Grzegorza Anotniaka znajdzicie ciekawy artykuł o tzw. globbingu, naprawdę interesująca lektura dla kogoś, kto tworzy narzędzia wykorzystywane z linii komend:
http://anadoxin.org/blog/blog/20141016/enabling-globbing-in-a-console-win32-application/
Gynvael Coldwind jak zwykle nie zawodzi i na jego blogu znajdziecie tutorial ze Strefy CTF (seria artykułów dla magazynu Programista):
http://gynvael.coldwind.pl/?id=545
Sebastien Andrivet opublikował obfuscator dla C++ bazujący na metaprogramowaniu, coś co kiedyś kolega deus próbował zaimplementować bez skutku:
https://github.com/andrivet/ADVobfuscator
Michał Grzegorzewski napisał artykuł o wykorzystaniu nowego narzędzia od Microsoft – Sysmon. Oprócz tego, jeśli przejrzycie jego blog to możecie się zdziwić ile ciekawych wpisów na temat internalsów Windowsa popełnił:
http://zine.net.pl/blogs/mgrzeg/archive/2014/10/17/sysmon.aspx
Z innych ciekawych rzeczy, o których w sumie niedawno się dowiedziałem i co mnie zaskoczyło to zakończenie produkcji exe-protectora i systemu licencyjnego Armadillo aka Software Passport:
Świeczka na drogę [i] w postaci uniwersalnego unpackera dilloDIE 😛
Fabian “ryg” Giesen znany koder z grupy demoscenowej Farbrausch napisał o wadach i zaletach systemów little i big endian oczami programisty:
http://fgiesen.wordpress.com/2014/10/25/little-endian-vs-big-endian/
Jak odczytać pamięć klucza sprzętowego ROCKEY2?
ROCKEY2 jest prostym kluczem sprzętowym (tzw. dongle), wykorzystywanym m.in. w systemach licencyjnych oprogramowania.
Całe zabezpieczenie opiera się także na envelope (czyli exe-protectorze), jednak ze względu na prostotę tego konkretnego modelu klucza nie polecałbym jego stosowania w zabezpieczeniu oprogramowania.
ROCKEY2 posiada wbudowaną pamięć, składającą się z 5 bloków po 512 bajtów każdy.
Poniżej znajdziecie kod pozwalający odczytać wszystkie banki pamięci klucza. Wymagana jest do tego znajomość poprawnego identyfikatora użytkownika (uid), a do kompilacji potrzebne Wam będzie SDK tegoż klucza.
#include <windows.h> #include <stdio.h> #include "Rockey2.h" // prosta funkcja zapisujaca zawartosc bufora do pliku void save_file(char *file_name, char *buffer_bytes, size_t buffer_size) { FILE *file_handle = NULL; file_handle = fopen(file_name, "wb+"); fwrite(buffer_bytes, 1, buffer_size, file_handle); fclose(file_handle); } // zapisuje wybrany blok pamieci klucza Rockey2 do pliku void dump_rockey2_block(int key_handle, int block_index, char *file_name) { BYTE buffer_bytes[512] = { 0 }; int result = 0; result = RY2_Read(key_handle, block_index, buffer_bytes); save_file(file_name, buffer_bytes, sizeof(buffer_bytes)); } int main(int argc, char **argv) { // liczba znalezionych kluczy int keys_count = 0; // uchwyt otworzonego klucza int key_handle = 0; int i = 0; // identyfikator klucza potrzebny do jego otwarcia DWORD uid = 0x12345678; DWORD hid = 0; printf("[i] memory dumper dla kluczy Rockey2 - www.secnews.pl\n"); // znajdz aktualnie dostepne klucze Rockey2 keys_count = RY2_Find(); if (keys_count == 0) { printf("[!] nie znaleziono zadnych kluczy Rockey!"); return 1; } printf("[i] znalezionych kluczy Rockey2 = %i\n", keys_count); // otworz klucz korzystajac z parametru UID key_handle = RY2_Open(1, uid, &hid); if (key_handle < 0) { printf("[!] nie udalo sie uzyskac dostepu do klucza (bledny uid?)!"); return 2; } printf("[i] uchwyt klucza = %08X, HardwareId = %08X\n", key_handle, hid); // odczytaj wybrane bloki pamieci klucza // Rockey2 posiada 5 blokow po 512 bajtow kazdy dump_rockey2_block(key_handle, 0, "block_dump_0.bin"); //dump_rockey2_block(key_handle, 1, "block_dump_1.bin"); //dump_rockey2_block(key_handle, 2, "block_dump_2.bin"); //dump_rockey2_block(key_handle, 3, "block_dump_3.bin"); //dump_rockey2_block(key_handle, 4, "block_dump_4.bin"); // zamknij klucz RY2_Close(0); return 0; }