GEAR
HEAD SHOT
LOGO
1. Cek versi kernel :
uname -r atau uname -a atau cat /proc/version atau dmesg | grep linux
info lebih lanjut : uname --help
2. Penjelasan syscall https://blog.packagecloud.io/eng/2016/04/05/the-definitive-guide-to-linux-system-calls/
3. Status, start, stop dan restart service :
sudo systemctl status nama_service, contoh sudo systemctl status apache2 jika selesai bisa tekan q.
sudo systemctl start nama_service, contoh sudo systemctl start apache2
4.
BUFFER OVERFLOW EXPLOIT
Buffer overflow biasa dimanfaatkan untuk mengexploitasi kerentanan suatu program. Sesuai dengan namanya, buffer overflow berarti meload buffer dengan data yang lebih besar dari daya tampungnya. Variable lokal disimpan di stack memori. Apabila buffer variable lokal ini di overflow, maka data kelebihannya akan tersimpan di stack juga. Stack merupakan bagian penting yang menyimpan data parameter fungsi, variable lokal dan alamat instruksi pointer. Mengubah alamat instruksi pointer di stack akan menyebabkan perubahan alur eksekusi program. Menurut saya ada kemiripan dengan codecave, yaitu sama-sama mengubah alur eksekusi program yang sudah dicompile. Berikut ini skenario pembelokan eksekusi program :
#========================
.section .data
.section .text
.globl _start
jmp dummy
_start:
pop esi #menyimpan alamat string command shell ke register eax
#lakukan sesuatu dengan alamat tersebut, terserah mungkin mau di print atau
#ekseskusi command shell (biasanya dengan syscall 11 execve)
dummy:
call _start #call ini bertujuan agar alamat instruksi dibawah disimpan di stack
.string "simple string"
#========================
Ilustrasi dalam bahasa C :
void main(int argc, char **argv)
{
char *name[2];
name[0] = "/bin/sh";
name[1] = NULL;
//selanjutnya, int execve(char *file, char *argv[], char *env[])
execve(name[0], name, NULL);
exit(0);
}
Register yang digunakan :
1. EAX : 0xb - nomor syscall
2. EBX : alamat dari nama program
3. ECX : alamat null-terminated argument-vector, argv (alamat dari nama)
4. EDX : alamat null-terminated environment-vector, env/enp (NULL)
Sumber :
1. https://www.tenouk.com/Bufferoverflowc/Bufferoverflow5.html
2. https://insecure.org/stf/smashstack.html
ASSEMBLY C/C++
BASIC ASM
Basic Asm bisa berada diluar fungsi.
Format basic assembly GNU GCC :
asm asm-qualifiers( AssemblerInstructions)
asm-qualifiers bisa :
volatile. Ini optional. Semua basic asm sudah secara implicit volatile. Volatile maksudnya manipulasi input untuk mengubah output.
inline. Ini dioptimalkan untuk menghasilkan ukuran statement asm sekecil mungkin.
untuk satu baris :
void main()
{ __asm__("movl %ecx %eax");
}
__asm__("movl %ecx %eax \n\t""movl %eax %ebx \n\t" "movl %ebx %edx"
EXTENDED ASSEMBLY - DENGAN C EXPRESSION OPERANDS volatile. Volatile maksudnya manipulsi input untuk mengubah output.
inline. Ini dioptimalkan untuk menghasilkan ukuran statement asm sekecil mungkin.
goto. Ini menginformasikan pada compiler bahwa statement asm mungkin akan melakukan jump ke label yang ada di daftar GotoLabels.
• BIT - Ukuran terkecil dari data. Dapat berupa 0 atau 1.• BYTE - 1byte terdiri dari 8bit (aristektur processor x86_64). Nilai maksimal yang dapat ditampung adalah 255 (0-255). Untuk memudahkan dalam membaca bilangan biner maka dibuatlah bilangan hexadecimal.• WORD - Satu word berarti 2byte, ukuran masimal datanya 0FFFFh (atau 65535d).• DOUBLE WORD - DoubelWord adalah 4byte. Nilai Maksimal = 0FFFFFFFF (4294967295d).• KILOBYTE - Satu kilobyte adalah 1024 byte (32*32byte)• MEGABYTE - Satu megabyte adalah 1024*1024 atau 1,048,578 byte.
Dalam bahasa tingkat tinggi seperti java dan python, string mungkin tidak memerlukan perhatian khusus. Tapi pada bahasa c/c++ string perlu ditangani secara kusus. Terlebih lagi dalam bahasa assembly. Dulu ketika komputer hanya dijual di Amerika, tidak ada masalah encoding karena ASCII sudah cukup untuk digunakan sebagai pengkodean karakter yang ukurannya cuma memerlukan 1byte.
Seiring perkembangan komputer dan internet, hal tersebut menjadi masalah karena tidak dapat menampilkan karakter tertentu seperti huruf korea dan arab. Masalah tersebut diatasi dengan teknologi code page. Jadi setiap negara memiliki code page masing-masing dalam pengkodean karakternya. Tapi hal tersebut menimbulkan masalah baru lagi, karakter untuk bahasa berbeda tidak dapat ditampilkan dalam satu mesin yang sama. Maka lahirlah utf-16 dan utf-32. UTF-16 menyimpan karakter dengan ukuran 2byte sedangkan UTF-32 menyimpan karakter dalam ukuran 4byte. Masalah lain yang muncul adalah adanya pemborosan storage penyimpanan ketika karakter yang disimpan hanya ASCII dan harus disimpan dengan menghabiskan 2byte atau 4byte, ini dirasa overkill.
Sederet masalah diatas akhirnya terpecahkan dengan lahirnya UTF-8. UTF-8 menyimpan karakter dengan ukuran 1byte, 2byte, 3byte sampai 4byte tergantung kebutuhan. ASCII disimpan hanya menggunakan 1byte. Masalah dari sistem utf-8 ini adalah perlu identifikasi khusus untuk menentukan karakter. Misalnya "Aݔ" dalam hexadecimal "410754", bagaimana cara komputer membedakan karakter pertama adalah 0x41 dan karakter kedua dua byte 0x0754. Mengapa tidak 0x4107 dan 0x54 ? Nah, memang sulit dari sudut pandang bahasa tingkat tinggi. Tapi dari sudut pandang assembly semuanya menjadi jelas. Berikut tabel dari wikipedia bahasa indonesia :
| Bit code point | Code point pertama | Code point terakhir | Byte dalam sequence | Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 |
|---|---|---|---|---|---|---|---|---|---|
| 7 | U+0000 | U+007F | 1 | 0xxxxxxx | |||||
| 11 | U+0080 | U+07FF | 2 | 110xxxxx | 10xxxxxx | ||||
| 16 | U+0800 | U+FFFF | 3 | 1110xxxx | 10xxxxxx | 10xxxxxx | |||
| 21 | U+10000 | U+1FFFFF | 4 | 11110xxx | 10xxxxxx | 10xxxxxx | 10xxxxxx | ||
| 26 | U+200000 | U+3FFFFFF | 5 | 111110xx | 10xxxxxx | 10xxxxxx | 10xxxxxx | 10xxxxxx | |
| 31 | U+4000000 | U+7FFFFFFF | 6 | 1111110x | 10xxxxxx | 10xxxxxx | 10xxxxxx | 10xxxxxx | 10xxxxxx |
Jadi, cara membedakan apakah karakter tersebut 1byte, 2byte, 3byte atau 4byte adalah dari bilangan biner yang digunakan. Jika awalnya adalah 0, berarti jumlah byte merepresentasikan karakter tersebut adalah 1byte. Jika awalnya adalah 110, berarti ukuran karakter tersebut 2byte, 1110 untuk 3byte, 11110 untuk 4byte dan seterusnya. Byte selanjutnya jika berisi 10 berarti sambungan dari byte sebelumnya. Maka dapat diidentifikasi 0100 0001 adalah karakter yang hanya 1byte (A) , dan 11011101 10010100 adalah karakter 2byte (ݔ).
| .globl _start | |
| _start: | |
| mov %r0, $1 // file descriptor 1 (stdout) | |
| ldr %r1, =pesan | |
| mov %r2, $len_pesan | |
| mov %r7, $4 // syscall 4 (syswrite) | |
| swi $0 //linux kernel syscall | |
| mov %r0, $0 // exit status return 0 | |
| mov %r7, $1 // syscall 1 (exit) | |
| swi $0 //linux kernel syscall | |
Alhamdulillahirabbilalamin, pada saat ini kita semua masih diberi kesempatan untuk terus belajar, kita niatkan mudah-mudahan apa yang kita l...