Teks String: Kerentanan Tersembunyi dalam Perangkat Lunak Terintegrasi
Selama bertahun-tahun, keamanan komputer desktop selalu menjadi perhatian. Seketika mesin terhubung ke Internet, secara intrinsik ada kemungkinan adanya serangan. Serangan tersebut mungkin untuk mencuri data, merusak sistem, atau mengubah operasinya. Cara pelindungan sudah terkenal dan banyak diterapkan. Sistem terintegrasi selalu dianggap imun dari masalah semacam itu, karena jarang terhubung jaringan dan kode biasanya disimpan dalam ROM. Kondisi telah berubah. Sebagian besar sistem modern sekarang terhubung ke Internet, dan praktik umum adalah menyalin kode ke RAM untuk dieksekusi dari sana. Ini berarti keamanan sekarang menjadi pertimbangan penting dalam desain perangkat lunak terintegrasi.
Bahasa Inggris adalah alat komunikasi yang hebat. Bahasa ini sangat ekspresif dan memungkinkan komunikasi dengan presisi dan halus. Namun, dalam percakapan sehari-hari, sebagian besar dari kita malas dan sering menggunakan kata tanpa akurasi 100%. Contoh yang saya bawa di sini adalah cara safety dan security digunakan hampir secara bergantian, seolah-olah mereka sinonim. Menurut saya, definisi terbaik yang pernah saya dengar adalah: safety adalah proses melindungi dunia dari perangkat; security adalah melindungi perangkat dari dunia. Topik saya hari ini adalah security.
Jika sistem benar-benar perlu sepenuhnya tahan peluru, diperlukan enkripsi tingkat industri. Biasanya memerlukan dukungan hardware spesifik, yang meskipun mudah didapat, mungkin dianggap berlebihan untuk aplikasi di mana keamanan se tinggi itu tidak diperlukan. Dalam kasus seperti itu, ada opsi lain dan itulah yang ingin saya jelajahi.
Jika peretas dapat mengakses isi memori perangkat, mereka dapat mulai mengetahui apa yang dilakukan perangkat dan bagaimana caranya. Ini adalah tahap pertama dalam mengubah operasinya. Kode dapat di-disassemble dan, oleh karena itu, logika dapat terungkap. Tanpa enkripsi, ada sedikit yang dapat dilakukan untuk mencegah ini. Hal berikut yang mungkin dilakukan peretas adalah melihat hex/ASCII dump data dan mencari apa yang masuk akal di sana. Mereka mencari pola dan struktur yang dapat dikenali. Di sinilah beberapa langkah pencegahan dapat diambil. Meskipun enkripsi mungkin bukan opsi, obfusrasi adalah kemungkinan.
Tujuan obfusrasi data adalah menunda atau mencegah peretas dengan membuat data kurang dapat dikenali untuk apa itu. Memindai memory dump, salah satu hal yang mudah terlihat adalah teks string. Jadi, inilah yang akan saya fokuskan di sini.
Dalam kode C/C++, teks string biasanya hanya urutan byte yang berisi kode ASCII yang diakhiri dengan byte null. Itu sangat mudah terdeteksi, jadi saya akan mengubahnya. Pertama, alih-alih penutup null, byte pertama dari setiap string akan menjadi spesifikator panjang. Karakter string akan diacak sedikit datanya, agar terlihat lebih asing – yang akan saya lakukan adalah menukar dua nibble dari setiap byte. Saya perlu memiliki program utilitas tempat saya akan memasukkan teks string biasa dan menghasilkan deklarasi array dengan inisialisasi yang sesuai. Berikut adalah fungsi inti utilitas ini:
void scramble(int index, unsigned char *input) { unsigned char *charpointer, character; printf("unsigned char string%d[%d] = {0x%02x,", index, strlen(input)+1, strlen(input)); charpointer = input; while(*charpointer) { character = *charpointer++; character = ((character & 0x0f) << 4) | ((character & 0xf0) >> 4); printf("0x%02x", character); if (*charpointer) printf(","); } printf("}; // \"%s\"\n", input); } Jika saya meneruskan fungsi ini dengan indeks 4 dan string "Hello world" (asli, kan?), keluaran akan menjadi:
unsigned char string4[12] = {0x0b, 0x84, 0x56, 0xc6, 0xc6, 0xf6, 0x02, 0x77, 0xf6, 0x27, 0xc6, 0x46}; // "Hello world" Saya dapat menyalin dan menempelkan ini ke dalam kode saya, lalu yang perlu saya lakukan adalah menulis fungsi untuk mengurai teks saat perlu ditampilkan. Alih-alih memberi setiap string nomor indeks, saya dapat memberinya nama sembarang dengan mengganti parameter index dengan string. Perhatikan bahwa kode yang dihasilkan agak sendiri-dokumentasi, karena komentar menunjukkan string dalam bentuk yang dapat dibaca, tetapi, tentu saja, ini hanya muncul dalam kode sumber. Jika peretas memiliki akses ke kode sumber Anda, maka Anda berada dalam masalah yang cukup besar sehingga saya tidak dapat membantu lebih lanjut!
Berikut adalah beberapa kode untuk menggambarkan proses penguraian:
void main() { unsigned char temp, buffer[50]; int count = string4[0], index=0; while(count--) { temp = string4[index+1]; temp = ((temp & 0x0f) << 4) | ((temp & 0xf0) >> 4); buffer[index] = temp; index++; } buffer[index] = 0; printf("-%s-\n", buffer); } Penukaran nibble dalam setiap byte adalah salah satu dari banyak cara untuk melakukan pengacakan. Kemungkinan lain adalah, misalnya, memutar setiap karakter sebanyak tiga bit ke kiri. Berikut adalah kode untuk melakukan itu:
unsigned char leftrotate3(unsigned char c) { c = (c << 3) | (c >> 5); return c; } Teknik obfusrasi yang saya garis besar mengacak string berdasarkan karakter. Akan mungkin untuk melakukan sesuatu pada seluruh string. Misalnya, treat string sebagai urutan bit yang panjang dan putar sejumlah sembarang ke kiri. Saya akan menyimpan pengkodean algoritma ini untuk pembaca yang lebih antusias.
Vale untuk dicatat bahwa efek samping dari melokalisasi semua teks string adalah membuat versi perangkat lunak yang berbeda untuk bahasa lain cukup sederhana.
Saya harus mengulang dan menekankan bahwa obfusrasi data jauh dari tahan peluru dan, terbaiknya, akan memperlambat peretas yang serius. Jika tidak lain, kode penguraian dapat di-disassemble. Triknya dengan teknik ini adalah membuat obfusrasi menjadi jejak yang sulit diikuti. Jika Anda membutuhkan keamanan yang benar-benar lebih tinggi, Anda harus melihat enkripsi penuh.