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)

    [aaaa]           []           []
    malloc(120) -> free(120) -> tcache
    malloc(120) <- USE AFTER FREE

    1. PERAHTIIN SIZE MALLOCNYA
    2. PASTIIN ITU SUDAH DI FREE DAN ADA DI TCACHE

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)

kalo di print payload itu bakal kayak gini

INTEGER UNDERFLOW - OVERFLOW 2147483647 (max integer) misalkan kita tambah 1 -> hasilnya 0 kalo kita tambah 2 -> jadinya 1

underflow kebalikannya
0 kita kurangin 1-> 2147483647
0 kita kurangi 2 -> 2147483646

Last updated