Categories: Softskill.
Definisi
Reverse Engineering adalah teknik hacker untuk mengetahui lajur dan cara kerja dari suatu program. Harapannya adalah hacker dapat mengetahui dan berharap mendapatkan flaw atau celah dari program yang dimaksud. Hal ini dilakukan dengan cara melihat source code pada program tersebut.
Pada tag “Reverse” ini SEMUAnya akan mendebug program binary executable yang dicompile dengan bahasa C. Hasil reverse dari binary tersebut pasti berupa assembly. Sehingga, mau tidak mau kamu harus punya basic di bahasa assembly.
Kenapa ini penting?
Semua local root exploit yang kamu pake adalah hasil exploitasi dan debugging pada binary kernel yg berjalan. Kamu mah tinggal compile terus pake doang hahaha.
Masak iya seumur hidup cuma mau ngerti cara make exploit aja. Tentu kamu juga mau tau bagaimana cara membuatnya, iya kan? Ga cuma itu, disini kamu akan hands-on membuat exploit kamu sendiri terhadap aplikasi yang akan dicoba.
Loh, kok mirip pentest?
EXACTLY, cuma kamu melakukan pentest terhadap aplikasi binary
Oh iya, tentu namanya proses reverse engineering memiliki banyak tujuan dan teknik. Khusus tag “Reverse” kebanyakan akan membahas bagaimana cara melakukan exploitasi dengan teknik Buffer Overflow. Exploitasi ditujukan untuk melakukan injeksi shell dan berharap bisa mendapatkan shell linux hasil eksploitasi kita pada program.
Apa itu Buffer?
Tanpa perlu banyak basa-basi, langsung aja deh gan ke materi pengenalan.
A buffer is simply a contiguous block of computer memory that holds multiple instances of the same data type. C programmers normally associate with the word buffer arrays. Most commonly, character arrays. Arrays, like all variables in C, can be declared either static or dynamic. Static variables are allocated at load time on the data segment. Dynamic variables are allocated at run time on the stack. To overflow is to flow, or fill over the top, brims, or bounds.
Pokoknya perhatikan yang saya bold. Buffer adalah blok kontigu dari memori komputer yang berisikan data yang sejenis. Inti mudahnya seperti array pada bahasa C lah.
Sebelum lanjut, pastikan agan PERNAH menggunakan bahasa C. Kalau belum, silahkan dicoba dahulu
Terdapat 2 jenis variable yaitu statis dan dinamis. Statis selalu dialokasikan pada data segment, sedangkan dynamic dialokasikan pada stack
Tujuan utama Buffer Overflow adalah untuk melakukan penulisan ulang terhadap stack program yang ada. Sehingga memungkinkan kita untuk melakukan kontrol terhadap program yang sedang dijalankan. Salah satu contoh “kontrol” yang saya maksud adalah pemanggilan shell (/bin/sh) yang akan menjadi fokus utama tag “Reverse”
Process-Memory Organization
Namanya program yang sedang berjalan (yang kemudian disebut “proses”) itu berjalan pada memory dan memiliki 3 hal berikut
/------------------\ lower
| | memory
| Text | addresses
| |
|------------------|
| (Initialized) |
| Data |
| (Uninitialized) |
|------------------|
| |
| New Memory Cap |
| |
|------------------|
| |
| Stack | higher
| | memory
\------------------/ addresses
- 1. Text
Bagian program yang bersifat read-only, berisi instruksi dan data statis milik program. Intinya bukan daerah ini yang akan kamu exploit - 2. Data
Terdapat 2 jenis data yaitu initialized dan uninitialized. Variabel static diletakkan pada bagian ini. Apabila saat menjalankan program, si user membutuhkan alokasi data yang lebih besar. Program akan dihentikan sementara dan akan dilakukan penjadwalan ulang terhadap program dengan tambahan alokasi memory yang terletak antara data dan stack - 3. Stack
Kamu pernah mendengar istilah ini sebelumnya? Apalagi buat kamu mahasiswa informatika PASTI pernah mendengar ini di kuliah semacam Algoritma & Struktur Data.
Namanya Stack pada program ini memang memiliki cara kerja yang sama dengan stack yang kamu dengar pada kuliah. Seluruh instruksi akan dijalankan pada bagian ini. Inisialisasi alur dan pengambilan instruksi dilakukan dengan metode POP dan PUSH
Buat yang masih baru dengan “Stack”. Silahkan googling ya
Pokoknya, 2 rule untuk stack:
- 1. After a PUSH, Stack Pointerwill point to a lower memory address
- 2. After a POP, Stack Pointer will point to a higher memory address
Sehingga, setiap instruksi pasti memiliki address. Pada bahasa C, setiap instruksi atau line-of-code PASTI berada pada suatu subrutin. Minimal subrutin main(). Seperti contoh kode hello world dibawah
int main(){
printf(“Hello World”);
return 0;
}
Setiap subrutin juga berdiam menempati tempat yang bernama stack frame. Lokasi dari stack bisa terdapat pada register ESP dan lokasi dari base function/stack frame terdapat pada register EBP. Sekarang, kalau kamu mau lihat assembly dari program itu. Compile sebagai 32bit dan jalankan gdb seperti perintah dibawah
kucing$ gcc index.c -m32 -o index kucing$ gdb index (gdb) disas main Dump of assembler code for function main: 0x0804840b <+0>: lea 0x4(%esp),%ecx 0x0804840f <+4>: and $0xfffffff0,%esp 0x08048412 <+7>: pushl -0x4(%ecx) 0x08048415 <+10>: push %ebp 0x08048416 <+11>: mov %esp,%ebp 0x08048418 <+13>: push %ecx 0x08048419 <+14>: sub $0x4,%esp 0x0804841c <+17>: sub $0xc,%esp 0x0804841f <+20>: push $0x80484c0 0x08048424 <+25>: call 0x80482e0 <printf@plt> 0x08048429 <+30>: add $0x10,%esp 0x0804842c <+33>: mov $0x0,%eax 0x08048431 <+38>: mov -0x4(%ebp),%ecx 0x08048434 <+41>: leave 0x08048435 <+42>: lea -0x4(%ecx),%esp 0x08048438 <+45>: ret End of assembler dump. (gdb)
Kamu lihat pada *main+10 bahwa register ebp dipush ke dalam stack. Lalu register ESP yang merupakan stack pointer yang berisikan alamat awal program diletakkan pada register EBP (*main +11). Dan pointer ESPlah yang selalu berubah-ubah hingga program/subrutin selesai.
Selanjutnya kita akan bicara register.
Registers
Setiap program yang berjalan PASTI memiliki sesuatu yang bernama register. Intinya adalah memori internal milik dari program tersebut. Digunakan untuk menyimpan variabel-variabel yang dibutuhkan
Mengapa program masih perlu namanya memori internal berupa register? Soalnya bayangin aja gan kalau si program harus bolak-balik kontak prosesor dan memory untuk meminta variabel yang sering dipake, belum termasuk datanya harus lewat bus dll. Nanti kan repot dan malah memperlambat kinerja dari program.
Kalau sudah punya memory storage internal. Jadinya si program tinggal akses langsung tanpa perlu melalui memori komputer lagi.
Namanya register itu pada dasarnya berisi kumpulan variabel, ini sangat bergantung pada mesin yang digunakan. Namun sebagai gambaran dasar, berikut adalah register yang digunakan pada mesin Intel x86 (32-bit)
- - EAX : accumulator : used for performing calculations, and used to store return values from function calls. Basic operations such as add, subtract, compare use this general-purpose register
- - EBX : base (does not have anything to do with base pointer). It has no general purpose and can be used to store data.
- - ECX : counter : used for iterations. ECX counts downward.
- - EDX : data : this is an extension of the EAX register. It allows for more complex calculations (multiply, divide) by allowing extra data to be stored to facilitate those calculations.
- - ESP : stack pointer
- - EBP : base pointer
- - ESI : source index : holds location of input data
- - EDI : destination index: points to location of where result of data operation is stored
- - EIP : instruction pointer
Dan biasanya untuk yang 64-bit. Register yang depannya “E” itu menjadi “R”.
Sebagai contoh RAX, RBX, RCX, RDX, RSI, and RDI
Sebagai perbandingan lagi, address yang digunakan pada 32-bit adalah 4 byte (range 0x00000000 — 0xFFFFFFFF) dan untuk 64-bit adalah 8 byte (range 0x0000000000000000 — 0x00007FFFFFFFFFFF).
What’s next?
Saya rasa akan terlalu panjang kalau dilanjutkan ke percobaan buffer overflow. Untuk itulah, saya akan post di artikel selanjutnya. Langsung praktek bagaimana buffer overflow bekerja, termasuk juga didalamnya cara membuat exploit.
ReferensiCategories: CTF, Reverse Engineering
Disini saya akan membuat program menu pilihan menggunakan cobol. Saya hanya membuat 5 menu pilihan.
Berikut Listing kode yang saya buat :
Berikut Listing kode yang saya buat :
IDENTIFICATION DIVISION.PROGRAM-ID. GOTO1.ENVIRONMENT DIVISION.DATA DIVISION.WORKING-STORAGE SECTION.77 JAWAB PIC X.PROCEDURE DIVISION.TANYAKAN.DISPLAY ‘=====================’.DISPLAY ‘1. MAKANAN PEMBUKA’.DISPLAY ‘2. MAKANAN UTAMA’.DISPLAY ‘3. MAKANAN PENUTUP’.DISPLAY ‘4. MINUMAN’.DISPLAY ‘5. EXIT’.DISPLAY ‘=====================’.DISPLAY ‘PILIH KATEGORI YANG KAMU INGINKAN ? ‘.ACCEPT JAWAB.SELEKSI.IF JAWAB = ‘1’ GO TO MAKANP.IF JAWAB = ‘2’ GO TO MAKANU.IF JAWAB = ‘3’ GO TO MAKANPE.IF JAWAB = ‘4’ GO TO MINUM.IF JAWAB = ‘5’ GO TO SELESAI.MAKANP.DISPLAY ‘ ‘.DISPLAY ‘-ROTI COKELAT’.DISPLAY ‘-LEMPER’.GO TO SELESAI.MAKANU.DISPLAY ‘ ‘.DISPLAY ‘-NASI GORENG’.DISPLAY ‘-AYAM BAKAR + NASI’.DISPLAY ‘-SOTO AYAM + NASI’.DISPLAY ‘-NASI PADANG’.GO TO SELESAI.MAKANPE.DISPLAY ‘ ‘.DISPLAY ‘-PUDING COKELAT’.DISPLAY ‘-BUAH-BUAHAN’GO TO SELESAI.MINUM.DISPLAY ‘ ‘.DISPLAY ‘-AIR PUTIH’.DISPLAY ‘-ES TEH MANIS’.DISPLAY ‘-JUS’.GO TO SELESAI.SELESAI.STOP RUN.
Outputt yang dihasilkan :
Categories: COBOL
Soal1
Jika diketahui n adalah ganjil, maka n2 adalah .....
A. Ganjil
B. Genap
C. konstanta
D. A dan B benar
E. Tidak ada jawaban yang benar
Jawaban : A. Ganjil
Diketahui n adalah ganjil, artinya terdapat suatu bilangan bulat k sehingga
n = 2k + 1. Akan ditunjukkan bahwa n2 ganjil.
n2 = (2k + 1)2
= 4k2 + 4k + 1
= 2(2k2 + 2k) +1.
Perhatikan bahwa n2 = 2(2k2 + 2k) +1.Karena k adalah bilangan bulat, maka (2k2 + 2k) juga pasti bilangan bulat, sehingga n2 adalah ganjil.
Soal 2
Pernyataan berikut yang sesuai dengan metode pembuktian kontradiksi adalah…
A. Jika p benar maka q benar
B. Jika ~q benar maka ~p juga harus benar
C. Membuat permisalan jika p maka q adalah benar
D. Suatu pembuktian untuk pernyataan yang memuat bilangan asli
E. Tidak ada jawaban yang benar
Jawaban : A. Membuat Permisalan jika p maka q adalah benar
Kontradiksi ialah dua hal dimana kedua hal tersebut tidak boleh sama sama benar dalam waktu yang sama. Jadi, kita buat pemisalan jika p salah , q benar. Jika kita buat ke dalam operasi logika p maka q (p → q) maka hasil yang didapat adalah benar.
Soal 3
Yang manakah yang termasuk dalam metode pembuktian tidak langsung…
A. Metode kontraposisi
B. Metode Disjungsi
C. Metode Equivalen
D. Metode Ingkarang
E. Metode Eliminasi
Jawaban : A. Metode kontraposisi
Karena metode kontraposisi termasuk metode pembuktian tidak langsung.
Soal 4
Bertikut ini adalah pernyataan yang benar mengenai prinsip induksi sederhana, kecuali.....
A. N ≥ 1 untuk bilangan bulat positif
B. P(1) bernilai benar
C. P(n+1) harus bernilai benar
D. N ≥ 1 untuk bilangan ganjil
E. P(n) harus bernilai benar
Jawaban : D. N ≥ 1 untuk bilangan ganjil
Karena, salah satu ciri dari induksi sederhana adalah N ≥ 1 untuk bilangan bulat positif, sementara pada pilihan D hanya untuk bilangann ganjil.
Soal 5
Apakah N3 + 2n adalah kelipatan 3 berlaku untuk n = 1 dan berlaku kelipatan 3 untuk setiap bilangan bulat postitif n (menggunakan induksi matematika)…?
A. ya dan ya
B. ya dan tidak
C. tidak dan bisa jadi
D. tidak dan tidak
E. tidak ada jawaban yang benar
Jawaban : A. Ya dan ya
q Basis untuk n = 1 akan diperoleh :
13 + 2(1) = 3 yang merupakan kelipatan 3 (ya, berlaku n = 1)
q induksi (misalkan) untuk n = k asumsikan menjadi k3 + 2k = 3x
q adib untuk n = k + 1 berlaku :
(k + 1)3 + 2(k + 1) adalah kelipatan 3
(k3 + 3k2 + 3k+1) + 2k + 2
(k3 + 2k) + (3k2 + 3k + 3)
(k3 + 2k) + 3 (k2 + k + 1)
induksi
3x + 3 (k2 + k + 1)
3 (x + k2 + k + 1)
Kesimpulan : N3 + 2n adalah kelipatan 3 untuk setiap bilangan bulat positif n (ya, berlaku kelipatan 3).
Soal 6
Terdapat implikasi : Jika 15 habis dibagi 3, maka 15 adalah bilangan ganjil. kemudian 15 habis dibagi 3. Kesimpulannya adalah...
A. 15 habis dibagi 3
B. 15 adalah bilangan ganjil
C. 3 adalah bilangan ganjil
D. 3 habis dibagi 3
E. tidak ada jawaban yang benar
Jawaban : B. 15 adalah bilangan ganjil
Jika 15 habis dibagi 3, maka 15 adalah bilangan ganjil (p → q)
15 habis dibagi 3 (p )
∴ 15 adalah bilangan ganjil ( q)
Soal 7
misalkan p(n) benar untuk semua bilangan positif n ≥ 1 untuk bilangan 2 + 4 + 6 + ... + 2n = n(n + 1). p(n + 1) bernilai...
A. Benar
B. Salah
C. A dan B benar
D. A dan B salah
E. tidak ada jawaban yang benar
Jawaban : A. Benar
jika p(n + 1) benar, maka :
n = n + 1
2 + 4 + 6 + ... + 2n = n(n + 1)
2 + 4 + 6 + ... + 2n + 2(n + 1) = n + 1(n + 1 + 1)
2n + 2n + 2 = (n + 1) (n + 2)
2n + 2n + 2 = n (n + 1) + 2n + 2
= n2 + n + 2n + 2
= n2 + 3n + 2
= (n + 1) (n + 2) Terbukti Benar.
Soal 8
Penyelesaian dari 6x + 8y = 21 dan 3x + 4y = 7 dengan metode eleminasi adalah...
A. 7 = 2
B. 1 = 7
C. 0 = 7
D. 7 = 1
E. 2 = 7
Jawaban : C. 0 = 7
6x + 8y = 21 --> 6x + 8y = 21
3x + 4y = 7 --> 6x + 8y = 14 (persamaan kedua dikalikan dengan 2)
0 = 7
Soal 9
Jika diketahui m, n adalah kuadrat sempurna, maka terbuktik bahwa mn
adalah ...
A. bukan kuadrat sempurna
B. kuadrat sempurna
C. Konstanta
D. A dan C benar
E. Tidak ada jawaban yang benar
Jawaban : B. kuadrat sempurna
Misalkan m, n adalah kuadrat sempurna, artinya
m = k2, n = p2 untuk suatu k, p bilangan bulat.
mn = (k2)(p2)
= (kp)2
Karena k, p
Soal 10
Dibawah ini pernyataan yang benar tentang metode pembuktian langsung adalah ...
A. 3 adalah bilangan ganjil sebab terdapat 2
B. 4 adalah bilangan genap sebab terdapat 1
C. 5 adalah bilangan ganjil sebab terdapat 2
D. A, B, dan C benar
E. tidak ada jawaban yang benar
Jawaban : C. 5 adalah bilangan ganjil sebab terdapat 2
Suatu bilangan bulat n disebut bilangan GANJIL jika terdapat suatu bilangan bulat k, sehingga
n = 2k + 1.
5 = 2(2) + 1
5 = 4 + 1
5 = 5
Jika diketahui n adalah ganjil, maka n2 adalah .....
A. Ganjil
B. Genap
C. konstanta
D. A dan B benar
E. Tidak ada jawaban yang benar
Jawaban : A. Ganjil
Diketahui n adalah ganjil, artinya terdapat suatu bilangan bulat k sehingga
n = 2k + 1. Akan ditunjukkan bahwa n2 ganjil.
n2 = (2k + 1)2
= 4k2 + 4k + 1
= 2(2k2 + 2k) +1.
Perhatikan bahwa n2 = 2(2k2 + 2k) +1.Karena k adalah bilangan bulat, maka (2k2 + 2k) juga pasti bilangan bulat, sehingga n2 adalah ganjil.
Soal 2
Pernyataan berikut yang sesuai dengan metode pembuktian kontradiksi adalah…
A. Jika p benar maka q benar
B. Jika ~q benar maka ~p juga harus benar
C. Membuat permisalan jika p maka q adalah benar
D. Suatu pembuktian untuk pernyataan yang memuat bilangan asli
E. Tidak ada jawaban yang benar
Jawaban : A. Membuat Permisalan jika p maka q adalah benar
Kontradiksi ialah dua hal dimana kedua hal tersebut tidak boleh sama sama benar dalam waktu yang sama. Jadi, kita buat pemisalan jika p salah , q benar. Jika kita buat ke dalam operasi logika p maka q (p → q) maka hasil yang didapat adalah benar.
Soal 3
Yang manakah yang termasuk dalam metode pembuktian tidak langsung…
A. Metode kontraposisi
B. Metode Disjungsi
C. Metode Equivalen
D. Metode Ingkarang
E. Metode Eliminasi
Jawaban : A. Metode kontraposisi
Karena metode kontraposisi termasuk metode pembuktian tidak langsung.
Soal 4
Bertikut ini adalah pernyataan yang benar mengenai prinsip induksi sederhana, kecuali.....
A. N ≥ 1 untuk bilangan bulat positif
B. P(1) bernilai benar
C. P(n+1) harus bernilai benar
D. N ≥ 1 untuk bilangan ganjil
E. P(n) harus bernilai benar
Jawaban : D. N ≥ 1 untuk bilangan ganjil
Karena, salah satu ciri dari induksi sederhana adalah N ≥ 1 untuk bilangan bulat positif, sementara pada pilihan D hanya untuk bilangann ganjil.
Soal 5
Apakah N3 + 2n adalah kelipatan 3 berlaku untuk n = 1 dan berlaku kelipatan 3 untuk setiap bilangan bulat postitif n (menggunakan induksi matematika)…?
A. ya dan ya
B. ya dan tidak
C. tidak dan bisa jadi
D. tidak dan tidak
E. tidak ada jawaban yang benar
Jawaban : A. Ya dan ya
q Basis untuk n = 1 akan diperoleh :
13 + 2(1) = 3 yang merupakan kelipatan 3 (ya, berlaku n = 1)
q induksi (misalkan) untuk n = k asumsikan menjadi k3 + 2k = 3x
q adib untuk n = k + 1 berlaku :
(k + 1)3 + 2(k + 1) adalah kelipatan 3
(k3 + 3k2 + 3k+1) + 2k + 2
(k3 + 2k) + (3k2 + 3k + 3)
(k3 + 2k) + 3 (k2 + k + 1)
induksi
3x + 3 (k2 + k + 1)
3 (x + k2 + k + 1)
Kesimpulan : N3 + 2n adalah kelipatan 3 untuk setiap bilangan bulat positif n (ya, berlaku kelipatan 3).
Soal 6
Terdapat implikasi : Jika 15 habis dibagi 3, maka 15 adalah bilangan ganjil. kemudian 15 habis dibagi 3. Kesimpulannya adalah...
A. 15 habis dibagi 3
B. 15 adalah bilangan ganjil
C. 3 adalah bilangan ganjil
D. 3 habis dibagi 3
E. tidak ada jawaban yang benar
Jawaban : B. 15 adalah bilangan ganjil
Jika 15 habis dibagi 3, maka 15 adalah bilangan ganjil (p → q)
15 habis dibagi 3 (p )
∴ 15 adalah bilangan ganjil ( q)
Soal 7
misalkan p(n) benar untuk semua bilangan positif n ≥ 1 untuk bilangan 2 + 4 + 6 + ... + 2n = n(n + 1). p(n + 1) bernilai...
A. Benar
B. Salah
C. A dan B benar
D. A dan B salah
E. tidak ada jawaban yang benar
Jawaban : A. Benar
jika p(n + 1) benar, maka :
n = n + 1
2 + 4 + 6 + ... + 2n = n(n + 1)
2 + 4 + 6 + ... + 2n + 2(n + 1) = n + 1(n + 1 + 1)
2n + 2n + 2 = (n + 1) (n + 2)
2n + 2n + 2 = n (n + 1) + 2n + 2
= n2 + n + 2n + 2
= n2 + 3n + 2
= (n + 1) (n + 2) Terbukti Benar.
Soal 8
Penyelesaian dari 6x + 8y = 21 dan 3x + 4y = 7 dengan metode eleminasi adalah...
A. 7 = 2
B. 1 = 7
C. 0 = 7
D. 7 = 1
E. 2 = 7
Jawaban : C. 0 = 7
6x + 8y = 21 --> 6x + 8y = 21
3x + 4y = 7 --> 6x + 8y = 14 (persamaan kedua dikalikan dengan 2)
0 = 7
Soal 9
Jika diketahui m, n adalah kuadrat sempurna, maka terbuktik bahwa mn
adalah ...
A. bukan kuadrat sempurna
B. kuadrat sempurna
C. Konstanta
D. A dan C benar
E. Tidak ada jawaban yang benar
Jawaban : B. kuadrat sempurna
Misalkan m, n adalah kuadrat sempurna, artinya
m = k2, n = p2 untuk suatu k, p bilangan bulat.
mn = (k2)(p2)
= (kp)2
Karena k, p
Soal 10
Dibawah ini pernyataan yang benar tentang metode pembuktian langsung adalah ...
A. 3 adalah bilangan ganjil sebab terdapat 2
B. 4 adalah bilangan genap sebab terdapat 1
C. 5 adalah bilangan ganjil sebab terdapat 2
D. A, B, dan C benar
E. tidak ada jawaban yang benar
Jawaban : C. 5 adalah bilangan ganjil sebab terdapat 2
Suatu bilangan bulat n disebut bilangan GANJIL jika terdapat suatu bilangan bulat k, sehingga
n = 2k + 1.
5 = 2(2) + 1
5 = 4 + 1
5 = 5
Categories: MATIF
Subscribe to:
Posts (Atom)