benerin nis
===========================================================
RET2WIN
protection mau nyala apa aja masih bisa
RET2SHELLCODE
ga boleh ada NX Enabled
bisa kita trick pakai asm(shellcraft.sh())
RET2LIBC
sebenernya semua protection nyala-pun bisa
observation based
ROP (Return Oriented Programing)
urutannya adalah rdi, rsi, rdx, rcx, r8, r9
semua protection nyala-pun masih bisa
GOT OVERWRITE
RELRO harus mati (biasanya)
biasanya binarynya sekali jalan, terminate langsung
untuk soalnya, masih dicari, jarang keluar sih ini
bisa pake fmtstr payload untuk write,read GOT value. (pwn) fmtstr.write(a,b,c)
CANARY - 64 -> BOF 72 (BUFFER + 8) KALO MISAL ADA CANARY YANG TERJADI BUKAN +8 AJA, TAPIIII 64 + 8 + 16 (8 BYTE CANARY + 8 JUNK) JADI KALO BUFFER 64 DAN ADA CANARY, MAKA BUFFERNYA ITU 72 + CANARY + JUNK 8
PIE BRUTEFORCING: - BERARTI KAN RANDOMIZE ADDRESS, RIGHT, TAPI OFFSET STAY THE SAME BRUTE FORCE 4 BITS OFFSET payload = b'a'... payload = p64(0xabcdabcd) ^ ga bisa MSB <- LSB payload = b'a'... payload+= b'\x2a\x12' 1/16 attempts
SECCOMP - shellcode, seccomp itu membatasi shellcode - component (common): - open -> buka file / buka directory #initator-guide - read -> dipakai untuk melihat isi file - getdents64 -> dipake buat buka directory (listing) - write -> print out hasil yang dibaca - combination -> open - read - write -> open gendents64 - write - File Descriptor masing-masing shell command daitas itu ada parameternya - open(<path-to-filename/dir) - read(fd, tulis_kemana, size) - gendents64(fd, tulis_kemana, size) - write(fd, tulis_kemana, size) dibutuhin di read sama gedents64 yekan, -> read & gedents64, bakal pake 3 and increment misal seccompnya itu harus satu kali jalan tapi panjang commandnya, nah ini fdnya biasanya nambah terus 3, 4, 5, 6, .... (note, 1 sekali jalan) kalo misalnya ga harus sekali jalan, bisa pake nomor yang sama Kalo buat write, karena write ini bakal jadi jalan kita buat output, maka fdnya 1 (stdout)
USE AFTER FREE - babyheap (TCP1P 2023) malloc(_size) free(point)
RET2SYSCALL - selama ada yang bisa pindahin value, contoh - mov QWORD PTR x, y ; ret dan ada yang buat mengkosongkan dan mengisi value dari rax, itu bisa dikerjakan - hampir semua gadget bisas dipake, tergantun kebiasaan cara gampang: ROPgadget --binary binary --ropchain cara rumit, stepbystep: 1. cari offset (easy) 2. cari gadget - pop rdi - pop rsi - mov qword ptr [rdi],rsi - pop rax - pop rdx 3. susun payload - offset - pop rdi -> isi dengan writeable address .data atau elf.bss() + 8 - pop rsi -> isi dengan string binsh, b'/bin/sh\x00' atau b'/bin//sh' - [WRITE TO ADDRESS] mov qword ptr [rdi], rsi <- biasanya ada pop rbp - isi junk 8 byte - pop rax -> raxnya kita isi dengan value 0x3b (59) / suruh nambah2in *wink themis - pop rsi dan pop rdx -> isi dua2nya dengan 0x0 - panggil syscall mov rax, something <- 0x3b xor rax, rax -> rax = 0
STACK PIVOTING - biasanya itu ada leak address ke variable buffernya - inputnya limited (biasnaya dispecify) - awal dari rsp itu ngepoint ke awal dari variable buffernya, berarti kita bisa manfaatin returnnya itu untuk ngarah ke awal dari buffer, terus payload kita dimana? - payload kita itu kita taroh dipaling awal - gadget yang dibutuhin biasnaya itu, pop rsp payload + padding sampe offset + pop rsp (ngarahin ke payload kita buat di execute) NOTE IMPORTANT: ljust baksobakar = 10, misalkan offset itu 40 payload = b'baksobakar' payload = payload.ljust(40, b'a') #ljust(size, padding)
INTEGER UNDERFLOW - OVERFLOW 2147483647 (max integer) misalkan kita tambah 1 -> hasilnya 0 kalo kita tambah 2 -> jadinya 1
Last updated