問題タブ [buffer-overflow]
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.
security - 単純なスタックオーバーフローのシェルコード:シェルを使用した悪用されたプログラムは、execve( "/ bin / sh")の直後に終了します。
Linux(amd64)でバッファオーバーフローを試してみて、単純なプログラムを悪用しようとしましたが、失敗しました。セキュリティ機能を無効にしました(sysctl -w kernel.randomize_va_space = 0およびBIOSのnxビットを使用したアドレス空間配置のランダム化)。スタックにジャンプしてシェルコードを実行しますが、シェルは起動しません。execve syscallは成功しますが、その後は終了します。何が問題なのか分かりますか?シェルコードをスタンドアロンで実行すると、問題なく動作します。
ボーナスの質問:printfを呼び出す前にraxをゼロに設定する必要があるのはなぜですか?(コードのコメントを参照してください)
脆弱なファイルbuffer.s:
shellcode.s
explore.py
コンパイル済み:
で始まった:
gdbを使用したデバッグ:
c - get()について不平を言う場合は、scanf( "%s"、...)で同じことをしてみませんか?
差出人man gets
:
get()は絶対に使用しないでください。事前にデータを知らずにgets()が読み取る文字数を知ることは不可能であり、gets()はバッファの終わりを超えて文字を格納し続けるため、使用するのは非常に危険です。これは、コンピュータのセキュリティを破るために使用されてきました。代わりにfgets()を使用してください。
ほとんどすべての場所で、同じ問題(バッファオーバーフロー/バッファオーバーラン)が発生scanf
するはずの方法で使用されていることがわかります。この場合、この問題は存在しますか?マニュアルページにそれについての参照がないのはなぜですか?これをコンパイルするときにgccが警告しないのはなぜですか?scanf("%s",string)
scanf
-Wall
ps:フォーマット文字列で文字列の最大長をscanf
:で指定する方法があることを私は知っています。
編集:私は前のコードが正しいかどうかを判断するように求めていません。私の質問は、もしscanf("%s",string)
常に間違っているのなら、なぜ警告がなく、マニュアルページにそれについて何もないのですか?
c - ansi c の予期しない動作に問題がありますか?
予期しない動作に苦しんでいます。問題の定義は次のとおりです。
UDP プロトコルを介して LAN 上で通信するアプリケーションがあります。テキスト ファイルから IP アドレスとポート番号を読み取っています。最初は IP アドレスとポート番号は正常に機能していますが、しばらくすると、char 配列に格納されている IP アドレスが破損し、ガベージ値が取得されます。また、ファイルの書き込みもこれに影響されます。つまり、IP 配列にある値は、同じアプリケーションによって書き込まれるテキスト ファイルにも書き込まれます。何が問題なのか理解できません - 助けてもらえますか?
c - バッファオーバーフローを伴うコードサンプル(getsメソッド)。なぜ期待どおりに動作しないのですか?
これは、バッファオーバーフローを示す必要があるACプログラムからの抜粋です。
質問は、「バッファオーバーフローを作成せずに、ユーザーが最大で入力できる入力文字数」でした。
char-arrayの長さは8バイトなので、最初の答えは8でした。私の答えは正しいと確信していましたが、より多くの文字を試したところ、セグメンテーション違反が発生する前に入力できる文字の制限は11でした(VirtualBox Ubuntuでこれを実行しています)
だから私の質問は:なぜその8バイト配列に11文字を入力することが可能ですか?
android - HTC 以外のデバイスでの AudioRecord の問題
AudioRecord の使用に問題があります。
splmeterプロジェクトから派生したコードの一部を使用した例:
これは、HTC Dream と HTC Magic ではログの警告やエラーなしで完全に機能しますが、エミュレーターと Nexus One デバイスでは問題が発生します。
Nexus では、有用なデータが返されることはありません。リモートの友人にテストを行ってもらっているため、他の有用な情報を提供することはできません。
エミュレーター (Android 1.5、2.1、および 2.2) では、AudioFlinger から奇妙なエラーが発生し、AudioRecordThread でバッファー オーバーフローが発生します。また、UI の応答性が大幅に低下します (記録は UI とは別のスレッドで行われますが)。
私が間違っていることは明らかですか?Nexus One ハードウェアについて何か特別なことをする必要はありますか?
編集
問題を部分的に解決しました... AudioRecordのドキュメントには次のように書かれています:
AudioRecord オブジェクトを正常に作成するために必要な最小バッファ サイズを返します。このサイズは、負荷がかかった状態でのスムーズな録音を保証するものではないことに注意してください。AudioRecord インスタンスが新しいデータについてポーリングされると予想される頻度に従って、より高い値を選択する必要があります。
だから私はバッファの長さを
そして今、エミュレーターはうまく動作します。
しかし
ハードウェアはそうではありません。エミュレーターはその呼び出しから 640 の値を返しますが (1 秒あたり 12.5 ポーリングを行う)、8khz に基づいて、HTC ハードウェアは 4096 を返します! つまり、1 秒あたり約 2 回のポーリングと、0.5 秒の音声遅延です。さらに、Nexus One で同じ呼び出しを行うと、8192 が返されます。つまり、完全な 1 秒の遅延です。
それで終わったらいいのですが、HTCデバイスとすべてのエミュレーターが動作するようになったにもかかわらず、nexus oneはまだオーディオを返しません(まだ自分自身を持っていないので、適切なデバッグ情報を取得できません)。 (一部が他よりも遅れている場合でも)。
ここで何かひどく間違ったことをしていますか?
c - Macos10.6で単純なバッファオーバーフローを実行する
スタックベースのオーバーフローについて学び、スタックを利用するための簡単なコードを書こうとしています。しかし、どういうわけかそれはまったく機能しませんが、私のマシン(mac os leopard)にAbortトラップのみが表示されます
Mac osはオーバーフローの扱いが違うと思いますが、cコードでメモリを上書きすることはできません。例えば、
Linuxマシンでは、このコードは次のスタックを正常に上書きしますが、mac osでは防止されます(トラップの中止)
Macマシンで単純なスタックベースオーバーフローを実行する方法を知っている人はいますか?
assembly - 同じプログラムのアセンブリコード出力の違い
私はこの記事からバッファオーバーフローexample3を複製しようとしていますalephone
私はこれを、私が受講しているコンピュータセキュリティコースのプロジェクトの練習として行っています。どうぞよろしくお願いします。あなたの助けが必要です。私は次の例を実行し、作業を進めながらタスクを実行してきました。私の問題は、私のコンピューターにダンプされたアセンブリコードgdb
(VMWareで実行されているDebianLinuxイメージでこれを行っている)が記事の例とは異なることです。私が混乱していると思ういくつかの構成があります。
これが記事からのものです...
ご覧のとおり、この2つには違いがあります。混乱していて、コンピューターからアセンブリコードを完全に理解することはできません。両者の違いを知りたいのですが。
、、などとどうpushl
違うのpush
かmov vs movl
...
その表現はどういう0xhexavalue(%register)
意味ですか?
たくさん質問してすみませんが、どうしてもあなたの助けが必要です。
アップデート:
関数'function'のパラメータが別のアセンブリコードに変換されたのはなぜですか。
記事から、関数のパラメーター1、2、3がスタックにプッシュされたと思います。
私のコンピューターからのものでは、パラメーターはいくつかのオフセットでレジスター'esp'に移動されました。
彼らは違いますか?ありがとう
本当に助けてくれてありがとう...
c - 関数のリターンアドレスが想定値と異なります、バッファオーバーフロー、ヘルプをお願いします
みなさん、良い一日を!
バッファオーバーフローがどのように機能するかを理解しようとしています。現在、バッファオーバーフロー攻撃を実行するために変更することになっている関数のリターンアドレスのアドレスを決定しているところです。私はインターネットで読んだ例に基づいて簡単なプログラムを書きました。このプログラムが行うことは、関数の戻りアドレスのアドレスをスタックに格納するための整数ポインターを作成することです。これを行うには(関数/プログラム変数がスタック内でどのように編成されるかを理解していることを認めます)、バッファー変数のアドレスに8を追加し、それをretの値として設定します。ここでは、funcの差出人住所の場所に含まれる住所を変更するようなことは何もしていません。
更新:プログラムを少し変更したので、funcのパラメーターaのスタックアドレスを出力します。ご覧のとおり、aとバッファの間の距離は約8バイトです。つまり、スタックレイアウトに基づいて、保存されたFPと古いEIP(func return address)が間にあることを意味します。私は正しいですか?
プログラムは次のとおりです。
実行されたときのプログラムの出力:
代替テキストhttp://img20.imageshack.us/img20/2034/72783404.png
ご覧のとおり、変数bufferとretのアドレスを出力しています。ret変数の値を出力するステートメントを追加しました(funcのリターンアドレスの場所を想定しているため、funcが実行から戻った後に実行される次の命令のアドレスを出力する必要があります)。
これは、funcが戻った後に実行される命令の想定アドレスを示すダンプです。(緑色の下線付き)ご覧のとおり、その値は、変数retに含まれている印刷された値とは大きく異なります。
代替テキストhttp://img717.imageshack.us/img717/8273/assemblycodecopy.png
私の質問は、なぜそれらが違うのかということです。(もちろん、私がしたことはすべて正しいと仮定して)。そうでなければ、私は何を間違えましたか?プログラムのランタイムスタックについての私の理解は間違っていますか?これを理解するのを手伝ってください。私のプロジェクトは来週の予定で、まだほとんど触れていません。要求があったらごめんなさい、あなたの助けがひどく必要です。
c++ - wcsncpy_s を使用して文字列をコピーするときのバッファが小さすぎる
この C++ コードはちょっと不自由ですが、維持する必要があります。「バッファが小さすぎる」問題を理解できないようです。Visual Studio 2010 を使用しています。デバッガーに表示される値に基づいて、再現に必要な最小限のコードを作成します。申し訳ありませんが、実際のスニペット自体はテストしていません。また、デバッグ中にシステムのクリップボードが「ビジー」になっているため、コピーして貼り付けるだけではうまくいかないため、エラーがどこかに忍び寄る可能性がありますが、再確認します。私を信じてください、あなたは関数全体を見たくありません-意味をなすには長すぎます:)
tchar.h から
afxstr.h から:
WinNT.h から:
ああ、これらのマクロは決して終わらないようです。ここでやめます。最後に、myfile.cpp から:
これでアサーションがヒットし、デバッガーが開きtcsncpy_s.inl
、最後に次のコードが表示されます。
デバッガーは 62 行目を指します: _RETURN_BUFFER_TOO_SMALL
. 残念ながら、私は にいる間は物事の価値を見ることができませんtcsncpy_s.inl
。おそらく、経験豊富なコーダーがここで何が起こっているのか教えてくれるでしょうか? このコードはかなり古く、Unicode を念頭に置いて書かれていないと思います (おそらく間違っています)。古い N のくだらない銃 (C++0X のトリックやその他の空想的なものは使用しないでください) へのこのこだわりを修正する最善の方法は何ですか? - 弾丸の傷にパッチを当てたいだけです。
buffer - バッファとは何ですか?
私の言語の理解に関する限り、バッファは、int、float変数、文字配列などのようにデータが格納されるメモリの任意の部分です。ただし、バッファオーバーフローを読んでいて、スタックhttpについて読んでいるときにこのリンクに出くわしました://www.tenouk.com/Bufferoverflowc/Bufferoverflow2a.html このリンクの図は、関数のローカル変数からバッファを分離しています。これは正しいです?では、バッファとは何ですか?