2017-07-31 7 views
3

スタック情報(有効なコアに必要な他のビット)だけを含む "シンコア"を書き出すライブラリがありますが、ヒープ。これは必ずしも有用なわけではありませんが、コアは完全なコアよりはるかに小さく、時にはヒープの内容を提供したくない場合もあります。新しいLinuxカーネルでスタックメモリセグメントを見つける方法

このライブラリは、/proc/<PID>/mapsを読み、[stack][stack:<tid>]のセグメント(このプロセスにはスレッドがたくさんあります)を見つけることによって動作しました。例えば、私はこのような出力を参照してくださいね。

3.5のような古いLinuxカーネル上で正常に働いていた
... 
7fe848000000-7fe848021000 rw-p 00000000 00:00 0 
7fe848021000-7fe84c000000 ---p 00000000 00:00 0 
7fe84c1ff000-7fe84c200000 ---p 00000000 00:00 0 
7fe84c200000-7fe84ca00000 rw-p 00000000 00:00 0 [stack:25672] 
7fe84ca00000-7fe84cc00000 rw-p 00000000 00:00 0 
7fe84cdff000-7fe84ce00000 ---p 00000000 00:00 0 
7fe84ce00000-7fe84d600000 rw-p 00000000 00:00 0 [stack:25534] 
7fe84d600000-7fe84d800000 rw-p 00000000 00:00 0 
7fe84d9ff000-7fe84da00000 ---p 00000000 00:00 0 
7fe84da00000-7fe84e200000 rw-p 00000000 00:00 0 [stack:25532] 
7fe84e200000-7fe84e600000 rw-p 00000000 00:00 0 
7fe84e7fd000-7fe84e7fe000 ---p 00000000 00:00 0 
7fe84e7fe000-7fe84effe000 rw-p 00000000 00:00 0 [stack:25531] 
7fe84effe000-7fe84efff000 ---p 00000000 00:00 0 
7fe84efff000-7fe84f7ff000 rw-p 00000000 00:00 0 [stack:25530] 
7fe84f7ff000-7fe84f800000 ---p 00000000 00:00 0 
7fe84f800000-7fe850000000 rw-p 00000000 00:00 0 [stack:25529] 
7fe850000000-7fe850021000 rw-p 00000000 00:00 0 
7fe850021000-7fe854000000 ---p 00000000 00:00 0 
7fe854000000-7fe854400000 rw-p 00000000 00:00 0 
7fe8545ff000-7fe854600000 ---p 00000000 00:00 0 
    ... 
7fff5ce1d000-7fff5ce3e000 rw-p 00000000 00:00 0 [stack] 
    ... 

など(Ubuntuの12.04)と3.13(Ubuntuの14.04)。

しかし、より新しいカーネル(例えば、Ubuntu 16.04からの4.4)では、/proc/<PID>/mapsファイルはスレッドごとのスタックセグメントのエントリを含まないように見えます。私はメインスタックを見るだけです[stack];スタックセグメントのように見えるすべてのメモリセグメントには空のパス名セクションがあります。

これは、「シンコア」が薄すぎるため、メインスレッドのスタックだけが提供されることを意味します。

新しいカーネルで/proc/<PID>/smapsを調べようとしましたが、スレッドスタックに関連付けられているセグメントとそうでないセグメントを判別する方法が見つかりませんでした。

はまた、私はあるprocfsに(5)のマニュアルページをチェックし、それはまだ私が見てしなければならないものとして[stack:<tid>]フォーマットを示していますが、私はそれを見ていないよ...

誰もが、この情報が入った任意のアイデアを持っています他の利用可能な情報から推論できるかどうか

+0

おそらく、[The Stack Clash](https://blog.qualys.com/securitylabs/2017/06/19/the-stack-clash)の概念証明に役立つ情報があります。 – jww

+0

興味深い考えですが、私が調べたものはスレッドスタックではなくメインスタック( '[stack]')を攻撃するように見えました。 – MadScientist

答えて

0

この問題の実際の解決策は見つかりませんでした。私は短期的に何をしたのかを説明します:pthread_attr_getstacksize()を使用してスレッドスタックのサイズを取得した後、名前のないメモリセグメントを調べて、「シンコア」に書き込むものを決定すると、その正確なサイズを持ち、残りは無視しました。

これは非常に面白いヒューリスティックですが、それは私が思いつくことができたすべてでした。

私はまだ誰かがより信頼性の高い堅牢な代替手段を提供することを望んでいます。

関連する問題