問題タブ [memory-layout]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java のメモリ レイアウト
私は高校で Java のテストを受けました。どうやってそれを解決するかについて私が空白だったので、1つの質問が私を悩ませました。
次の Java コードを検討してください。
これを 4 バイト アドレスを持つマシンでネイティブ コードにコンパイルするとします。カウンター オブジェクトのメモリ内のレイアウトの図を描画します。すべての仮想関数テーブルを表示します。
linux - /proc/pid/maps の出力に同じセグメントが複数表示されるのはなぜですか?
テストは 32 ビット Linux で行われます
コードは次のとおりです。
cat /proc/pid/maps を使用してメモリ レイアウトを表示する と、コードとライブラリの3 つのテキストセグメントが表示されるようです。
この問題に関するガイドを教えてもらえますか? 本当にありがとうございました!
linux - Linux x86 では、カーネル空間はユーザー空間にマップされていますか?
Windows 32 ビットでは、カーネルは合計 4G のユーザー仮想メモリ空間から 1G の仮想メモリを予約し、カーネル空間の一部をこの 1G 空間にマップするようです。
だから私の質問は:
- 32 ビット Linux で同様の状況はありますか?
- もしそうなら、どうすればメモリレイアウト全体を見ることができますか?
おもう
特定のプロセスのユーザー空間レイアウトしか見ることができません..
ありがとうございました!
c - N 次元配列のメモリ レイアウトの選択
n次元ベクトル用のライブラリを書き始めました。
このライブラリでサポートしたい設計機能がいくつかあります。
- メモリ レイアウトは連続しています。これは、メモリの共有、ネットワーク経由での送信、およびファイルへの保存が、ポインターを渡すだけの問題であるためです。
- 次元が異なれば、サポートされる要素のサイズも異なります (つまり、バイトでもバイトでも
[0][0]
かまいません)。1
[1][0]
2
特定の次元のベクトルのメモリ レイアウトがどのように見えるかをいくつか表現した後、構造をレイアウトするには 2 つの方法があることに気付きました。
これが最初の方法です。どちらの表現も [2][4][3] 配列の視覚化です。
これが2番目の方法です。
あるレイアウトを他のレイアウトよりも選択する際に、特定の利点/欠点はありますか?
c - リターンアドレスの単純なフォーマット文字列を上書きするエクスプロイト
はい、かなりの数の同様の質問が既に存在します (5037601、19166698、4855162、14505995、5052648、13409508、7745146、7459630; 申し訳ありませんが、2 つ以上のリンクには十分な担当者がいません)。こと(クリック、クリック、http://codearcana.com/posts/2013/05/02/introduction-to-format-string-exploits.html)。私はそれらを読んで、大まかな考えは理解できたと思いますが、考えられる最も簡単なトレーニング おもちゃの例をうまく活用できていません。
はい、スタックは実行可能であり、メモリ レイアウトのランダム化は無効になっています。実行するたびに、 の同じアドレスが得られますa
。たとえば$ ruby -e 'print "AAAA"+("%08x."*16)'
、それをフィードできます。その結果、次のようになります。
これで、入力がメモリ内のどこにあるかを確認できます。を使用してスタックに値を書き込むことができます$ ruby -e 'print "12345%n"+("%08x."*16)'
。その結果、次のようになります。
明らかに、私の最終的な目標は、プログラムが NOP スレッドにジャンプしてシェルコードを実行するよう<something><NOPs><shellcode>
に、<something>
の戻りアドレスを上書きするようなものになると思われます。f
しかし、保存された差出人住所の住所は、今の私の入力に依存しているようですよね? 0xbfffece0 - len(input) - 12
12バイトのプロローグを想定して、に似た何か?結局のところ、この例は最も簡単ではないかもしれません...
私は混乱しています。何か案は?
linux - プロセス内の環境のメモリ アドレスの計算
セキュリティ コースの講義スライドから次のコードを取得しました。
このコードは、その環境でシェルコードを使用して脆弱なプログラムを呼び出します。シェルコードは、シェルを開く外部ファイル内のアセンブリ コードであり、VULN は脆弱なプログラムの名前を定義します。
私の質問: シェルコード アドレスはどのように計算されますか
addr 変数は、シェルコード (環境の一部) のアドレスを保持します。このアドレスがどのように決定されるかを誰かに説明してもらえますか? そう:
- 0xc0000000 - 4 はどこから来たのですか?
- シェルコードの長さとプログラム名が差し引かれるのはなぜですか?
このコードと脆弱なプログラムの両方が次のようにコンパイルされていることに注意してください。
そのため、アドレス空間のランダム化はオフになっています。
スタックはプロセス内の最初のもの(最上位メモリアドレス)であることを理解しました。スタックには、次の順序で含まれます。
- 環境データ。
- argv
- argc
- メインのリターンアドレス
- フレームポインタ
- メインのローカル変数
- ...等...
定数とグローバル データはスタックに格納されないため、VULN 定数の長さがシェルコードが配置されるアドレスに影響する理由もわかりません。
あなたが私のためにこれを片付けてくれることを願っています:-)
Intel x86 アーキテクチャの UNIX システムで作業していることに注意してください。
c - Linux は、下位スタック エンドの下にアクセスできないメモリ領域を保証していますか?
Linux は、最小サイズが保証されている下位スタック エンドの下にアクセスできないメモリ領域を提供しますか? そして、そのような保証された最小サイズが存在する場合、それは何ですか?
alloca()
言い換えれば、有効な非スタック メモリへのポインターをいつ心配し始めるべきでしょうか。