2021年3月15日月曜日

GOTとPLT

CTFのpwn問やると避けて通れないこの用語、やっとちょっとわかったので忘れる前のメモ書きです。

動的リンクと遅延リンク

まず、この2つの用語を理解するためには、動的リンクと遅延リンクの概念を理解する必要があります。

プログラムのコードを書いた後、そのプログラムは機械語に翻訳が行う(コンパイルする)必要があるのは前説明した通りなのですが、その後リンクという作業を行う必要があります。

このリンクというのは、プログラムの実行に必要な変数や関数をつなぎ合わせる作業です。わかりやすい例だとprintf()を使うにはlibcとつなぎ合わせる必要があるということです。

で、このリンク作業を実行ファイルを作るときに全部やって実行ファイルですべて完結するのが静的リンク、実行時に別ファイル(共有ライブラリ)にある関数とつなぎ合わせてあげるのが動的リンクです。

その動的リンクの中で、関数が呼び出されてからリンクを行うのが遅延リンクです。(ちなみに遅延リンク無効の動的リンク、Full RELROは実行時に全てリンクを行います)

GOTとPLT

前節で説明した技術を実現するために使われるのがPLTとGOTです。(Winは違うのを使ってるらしいけど知らんし興味が薄いのでノーコメントで)

GOT(Global Offset Table)

動的リンクを実現するための技術です。ELFファイルだと.got、.plt.got(遅延リンク有効時のみ)がこれに相当します。

リンクが必要な関数をここに切り離してまとめ、テキスト領域(機械語で書かれている、プログラム本体に相当する領域)はここを参照して関数実行するようにしておき、動的リンカは実行はじめにここを関数本体へのポインタに書き換えてあげることで動的リンクが実現されています。

PLT(Procedure Linkage Table)

遅延リンクを実現するための技術です。ELFファイルだと.pltがこれに相当します。

動作としては、関数呼び出しをここ経由にしておき、PLTはGOTを参照して関数を実行します。

最初GOTにはPLTのリンクを行う処理のアドレスを書いておきます。

初めて関数が呼び出されると、GOTはPLTのリンクを行う処理を指しているため、リンクが行われ、その後リンクによって解決した関数本体へのポインタをGOTに書き込みます。 PLTはリンク処理までもっていき、実際のリンク処理は動的リンカが行います。

それ以降はPLTを呼び出すとGOTには関数へのポインタが入っているため、関数本体がすぐに実行されます。(参考:[1])

.plt.got←どっちだよ

実行ファイルを覗くと.got以外に「.plt.got」というセクションがあります。これどっちの名前もついているため、ずっとどっちだよって言ってました。

正解は「PLTが書き換えるためのGOT領域」でした。

じゃあ遅延リンク有効なら.gotセクション要らなくねってなったんですけど、こっちは動的リンカがプログラム実行時に書き換える用のセクションとしての役割があるらしく、簡単なプログラムを書いて確認したところ、__libc_start_mainが.gotセクションにありました。

.plt.gotはその仕様上、書き込みをしなければならないため、遅延リンク有効の場合はどうあがいてもGOT Overritenの脅威がある(という自分での認識)。

遅延リンク無効の場合

遅延リンク無効でも.pltセクションは健在です←なんで?

.plt.gotは使用されず、動的リンカが.gotのポインタを最初に書き換えて、関数呼び出し時は.plt→.got→関数となります。

また、.gotは書き込み不可となっているため、GOTを書き換えてすきな関数を実行するのができません。

参考サイト[2]だけでなく実際に自分でも調べてみましたが、GCC 9.3.0でも同じ動作でした。Clangだと変わったりするのかなぁ

参考

[1] https://blog.tiqwab.com/2020/09/12/shared-library.html

[2] http://inaz2.hatenablog.com/entry/2014/04/30/173618

リンカ・ローダ実践開発テクニック(境井弘亮著 CQ出版社)



2021年3月6日土曜日

負のオンゲキ

みなさま、ごきげんよう。みれんくです。

突然ですが、あなたはセガが出している音ゲー「オンゲキ」をご存知でしょうか?

簡単に言うと「シューティング+音ゲー」です。ノーツに合わせてボタンを押すのと、レバーを操作することがあるゲームです。 

斬新な音ゲーですし、キャラもかわいいので気になったらやってみてください。

いかがでしたか?以下からはぼくのことなので、オンゲキ知らなかった人や興味ない人は戻るボタンを押してくださいね。

 

オンゲキが出来ん

ずっと言ってるけど、成長を感じないんすよね。

オンゲキの技術指標として、レーティングシステムというものがあります。諸悪の根源なんすけど。

そのシステムにおいて、自分は銀レート(13.00)到達が2020/7/28(Lv48)、金レート(14.00)が2020/9/22(Lv64くらい)、現在(2021/3/6)MAX14.36(Lv95)です。次の目標がプラチナレート(14.50)なんですけど…

あがらん、あがらんくてもいいけどできん

周りの人間が虹レ(15.00)目前だったり、後発でやって先にプラレ取られるのもそこそこクるものがありますが、単純に楽曲ができないのが一番キています。

まあ、出来具合を知るのにレーティングシステムは有効だと思っているので、自分が今のところどんなものかを知るためにオンゲキプレミアム契約してOngekiScoreLogで見てみました。

誰でも見れるみたいなのでここから見てみてください。

リーセント低くね???

本当に伸びていないのをひしひしと感じております。ていうか落ちてね?

ボルテはちょっと伸びている(VW金枠麗華→XG金枠魔騎士、VW無枠魔騎士)ので、いったんこっちも本腰を入れようというのが今回の内容です。

こうすればいいのではという考察中心です。結果は追記で書くかもしれないです。

 

なにが悪いのか

人生、分析してバグを潰すのが重要だと思っているのでまず何が悪いのかを考えてみます。

そのいち:オンゲキに本気"マジ"でなかった

それはそう。今までボルテのほうに割き気味だったのであっちで成果が出てこっちででないのは当たり前だと思う。

これの解決法はオンゲキ重点的にやるだけなのでこれで終わりです。

そのに:精度が悪すぎる

ボルテで難曲クリアを目標にやっていたため、精度度外視で押すことと、ほかを捨てて取るべきものを取るというスタンスでやっていたためそれがとても出ているように感じています。

オンゲキのスコアシステムはみなさんご存知の通りBREAK10=HIT2.5=MISS1という、最高判定以外に厳しめになっています。

また、オンゲキは基本、自機のHPが残っている限り曲が終了することがありません。一見良さそうに見えるシステムですが、逆に言えば「音ゲー」をするなら「スコア」を見るしか無くなるんです。

ということは精度を取らないとどうしようもないです。どうしようね。

精度対策

  1. 精度に意識するようにする
  2. Lv12前半を鳥+取る、場合によってはレベル下げる(下げても11まで)

あたりなのかな…時間はかかるけど…

そのさん:認識出来てない

これはボルテにも言えることですけど、認識が弱いです。

ボルテならび赤のCD叩かせるとことか寿司赤の直角+BTのハイハイ言うところとか何を押すかは理解してるけど、リズムがわからないってのがあります。

オンゲキは結構そういうのが12後半から出始めるし該当曲量があるので、本当に厳しい。

また、オンゲキは右左どっちでもノーツが処理できるので、どっちでやるかを判別しないといけないですけど、それも出来てないですね。

対策

  1. オンゲキをやめる
  2. 曲数積む(Lv12~)
  3. ハイスピ変える
  4. 目押し

1は経済的にも精神的にも楽になれると思う。おんなじ境遇の方いたらおすすめします。

が、それは「人生つらぽよ→じゃあ人生やめれば?」と同義なのでぼくはやりません。

2は正攻法な気がしています。12でも開いてない紫が結構あるのでそこを開けるかな…

3が迷っています。基本は10.5(僕的にはちょい遅め)なんですけど、密を避ける為に上げるってのも手なんだろうけど、オンゲキでそれやるとレバーと壁が死ぬのでわからなくなっています。

目線変えるのはちょっと試してみますけど、おうちボルテでやったら微妙だった(レーンの性質上)のでわからん…

速めでやるべきとか遅めでやるべきとかあれば教えてください… 

4もわからん…リズムがわからんなら来た瞬間に押せばええやん!って思ったけど、密度やハイスピに絡んでくるから…

そのよん:トリルができん

 

 

プレイ中無限に言ってる。

対策

  1. リズム取って毎日動かす
  2. 両手をつかう、運指を組む

1については、片手でやる場合に安定しないことが多いため、安定してやれるようにするためにするべきだと思うんだよね。ボルテのトリルも通ってるけどニアか通ってないかだから。

2はオンゲキ固有に近いです。両ボタンつかえることを生かす作戦です。低レべ曲をわざと両手でやるとかいいかも、でも精度も必要だから前に書いたやつと同時にやるのもどうなんだろうね…

 

まとめ

みれんくちゃんの今後にご期待ください

なんもわからん、とりあえず来週の月曜はオンゲキさせてくれ