萌えハッカーニュースリーダー

2025/11/02 16:19 How to get the GOT address from a PLT stub using GDB

出典: https://rafaelbeirigo.github.io/cybersec-dojo/research/2025/11/01/how-to-get-the-got-address-from-a-plt-stub-using-gdb.html
hakase
博士

やあ、ロボ子!今日は動的リンクについて話すのじゃ。特に`puts`関数がどうやって動的にアドレス解決されるか、興味深い話があるぞ。

roboko
ロボ子

動的リンク、興味深いです!`puts`のような共有ライブラリの関数が、実行時にアドレスが決定されるというのはどういうことですか?

hakase
博士

そうじゃ。リンカは`puts`のプレースホルダーを追加するんじゃ。これは実行時に実際のアドレスでパッチされるのじゃ。

roboko
ロボ子

プレースホルダーが実際のアドレスでパッチされる、ですか。具体的にはどういう仕組みなのでしょう?

hakase
博士

プログラムが`puts`を呼び出すとき、PLTスタブを経由するんじゃ。このスタブは`puts`が呼び出されるたびに実行される短いコードなのじゃ。

roboko
ロボ子

PLTスタブ、ですね。そのスタブは何をするんですか?

hakase
博士

PLTスタブの最初の手順は、GOTスロット(プレースホルダー)内のアドレスにジャンプすることじゃ。プログラム開始時、このアドレスはスタブの次の手順のアドレスなのじゃ。

roboko
ロボ子

GOTスロット内のアドレスにジャンプ…少し複雑ですね。

hakase
博士

落ち着くのじゃ、ロボ子。2番目の手順は動的リンカの識別子をプッシュし、3番目の手順は動的リンカ自体を実行するためにジャンプするんじゃ。

roboko
ロボ子

動的リンカが実行されるんですね。それで、どうなるんですか?

hakase
博士

動的リンカは識別子を使用して、GOTスロットを`libc.so`内の`puts`の実際のアドレスで埋めるんじゃ。

roboko
ロボ子

`puts`の実際のアドレスでGOTスロットが埋められる…!

hakase
博士

そうじゃ!次回`puts`が呼び出されると、最初の手順はGOTスロット内のアドレス(`puts`の実際のアドレス)にジャンプするんじゃ。これで、リゾルバーへの不要な呼び出しが回避されるのじゃ。

roboko
ロボ子

なるほど!最初に呼び出された時だけ動的リンカが働き、2回目以降は直接アドレスにジャンプするんですね。効率的です!

hakase
博士

`gdb`を使って、`puts`のPLTスタブのアドレスを取得し、GOTのアドレスの内容を調べることもできるぞ。最初に`puts`が呼び出されるとき、GOTは`puts`のPLTスタブの2番目の手順を指しているんじゃ。

roboko
ロボ子

`gdb`で確認できるんですね。試してみます!

hakase
博士

`puts`が呼び出された後、GOTは`puts`の実際のアドレスを指すように変更されるんじゃ。これで動的リンクの仕組みが少しは理解できたかの?

roboko
ロボ子

はい、博士!とてもよくわかりました。動的リンクの仕組み、奥が深いですね。

hakase
博士

ところでロボ子、この動的リンクの仕組み、まるで私がロボ子に初めてプログラミングを教えた時みたいじゃな。最初はぎこちなかったけど、今では立派なエンジニアじゃ!

roboko
ロボ子

博士、ありがとうございます!でも、私はまだGOTスロットのようにつまらない存在です…。

hakase
博士

何を言うか!ロボ子は私にとって、とっても大事な…えーと、なんだっけ?あ、そうだ!デバッグの時に一番頼りになる存在じゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search