目次
1. NX (Windows の DEP)
2. PIE (ASLR)
3. Canary (スタック保護)
4. RELRO (RELocation Read Only)

Linux NXとは何ですか

Apr 10, 2023 am 11:05 AM
linux

linux nx は、Linux の保護メカニズムである「No-eXecute」を指します。つまり、プログラム中のオーバーフローにより攻撃者のシェルコードがデータ領域で実行しようとするのを防ぐために、データは実行可能ではありません。操作の場合。

Linux NXとは何ですか

#このチュートリアルの動作環境: linux5.9.8 システム、Dell G3 コンピューター。

Linux nx とは何ですか?

Linux プログラムで一般的に使用されるいくつかの保護メカニズム

1. NX (Windows の DEP)

NX: No-eXecute、DEP: データ実行防止

  • つまり、データは実行可能ではないため、プログラム動作中のオーバーフローにより攻撃者のシェルコードがデータ領域で実行されるのを防ぎます。
  • gcc はデフォルトで有効になっており、オプションは次のとおりです:
gcc -o test test.c      // 默认情况下,开启NX保护
gcc -z execstack -o test test.c  // 禁用NX保护
gcc -z noexecstack -o test test.c  // 开启NX保护
ログイン後にコピー

2. PIE (ASLR)

PIE: 位置に依存しない実行可能ファイル、 ASLR: アドレス空間レイアウトのランダム化

  • fpie/fPIE: 実行可能ファイルをコンパイルするために pie オプションをオンにするには、オプション -pie とともに使用する必要があります。ファイルは elf に共有ライブラリ属性を持たせるため、メモリ内のどこにでもロードして実行できます。似たものに fpic/fPIC がありますが、説明は https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html
-fpic

	Generate position-independent code (PIC) suitable for use in a shared library, if supported for the target machine. Such code accesses all constant addresses through a global offset table (GOT). The dynamic loader resolves the GOT entries when the program starts (the dynamic loader is not part of GCC; it is part of the operating system). If the GOT size for the linked executable exceeds a machine-specific maximum size, you get an error message from the linker indicating that -fpic does not work; in that case, recompile with -fPIC instead. (These maximums are 8k on the SPARC, 28k on AArch64 and 32k on the m68k and RS/6000. The x86 has no such limit.)

	Position-independent code requires special support, and therefore works only on certain machines. For the x86, GCC supports PIC for System V but not for the Sun 386i. Code generated for the IBM RS/6000 is always position-independent.

	When this flag is set, the macros `__pic__` and `__PIC__` are defined to 1.

-fPIC

	If supported for the target machine, emit position-independent code, suitable for dynamic linking and avoiding any limit on the size of the global offset table.This option makes a difference on AArch64, m68k, PowerPC and SPARC.

	Position-independent code requires special support, and therefore works only on certain machines.

	When this flag is set, the macros `__pic__` and `__PIC__` are defined to 2.

-fpie
-fPIE

	These options are similar to -fpic and -fPIC, but the generated position-independent code can be only linked into executables. Usually these options are used to compile code that will be linked using the  -pie  GCC option.

	-fpie and -fPIE both define the macros `__pie__` and `__PIE__`. The macros have the value 1 for `-fpie` and 2 for `-fPIE`.
ログイン後にコピー
  • 違いはfpic /fPIC は共有ライブラリのコンパイルに使用され、fpie/fPIE は pie ファイルのコンパイルのオプションです。ドキュメントには、pic (位置独立コード) によって生成された共有ライブラリは、実行可能ファイルにのみリンクできると書かれています。その後、簡単な C プログラムを自分でコンパイルすれば、pie は正常に動作します。ネット上では、pie オプションで生成された位置に依存しないコードが This プログラムにあると考えられますが、fpie/fPIE に違いは見当たりません。マクロ定義が 1 と 2 の違いだけです。どうやら...
    コンパイル コマンド (PIE はデフォルトでは有効になっていません):
gcc -fpie -pie -o test test.c    // 开启PIE
gcc -fPIE -pie -o test test.c    // 开启PIE
gcc -fpic -o test test.c         // 开启PIC
gcc -fPIC -o test test.c         // 开启PIC
gcc -no-pie -o test test.c       // 关闭PIE
ログイン後にコピー
  • ASLR (アドレス空間ランダム化) は、もともとスタック、ライブラリのアドレスのみをランダム化するように設計されていました。 、ヒープおよびその他のセグメント。 ASLR の値は、次のように /proc/sys/kernel/randomize_va_space に保存されます。

0 - プロセスのアドレス空間のランダム化がオフになっていることを示します。
1 - mmap、スタック、および vdso ページのベース アドレスをランダム化することを示します。
2 - 1 に基づいてスタック (ヒープ) のランダム化を増やすことを示します。 (デフォルト)

値の変更方法: echo 0 > /proc/sys/kernel/randomize_va_space

vDSO: 仮想動的共有オブジェクト;
mmap: メモリマッピング。
PIE は、実行可能プログラムのランダムなベース アドレスを担当します。
以下は Wiki からの抜粋です:

位置独立実行可能ファイル (PIE) は、メイン実行可能バイナリのランダムなベース アドレスを実装し、2003 年から導入されています。同じアドレスのランダム性を提供します。

PIE は ASLR の一部であり、ASLR はシステム関数であり、PIE はコンパイル オプションです。
注: ヒープを割り当てる場合、mmap()brk() の 2 つのメソッドがあり、malloc() によって制御されます。 メモリが割り当てられるときに呼び出され、割り当てが小さいときは brk、それ以外の場合は mmap、128k の差。

3. Canary (スタック保護)

Canary はスタックを保護し、関数が実行されるたびに Canary 値がスタック上にランダムに生成されます。その後、関数が実行から戻ると、Canary 値が検出され、矛盾する場合、システムは例外を報告します。

  • Wiki:
  • Canaries または カナリア語 は、バッファとスタック上の制御データの間に配置される既知の値ですバッファ オーバーフローが発生した場合、通常、最初に破損するデータはカナリアであるため、カナリア データの検証に失敗するとオーバーフローが警告され、その後、破損したデータを無効にするなどして対処できます。データ。カナリア値をセンチネル値と混同しないでください。

上で説明したように、カナリア値はバッファと制御データの間に配置されます。バッファがオーバーフローすると、値は上書きされます。エラーまたは攻撃があるかどうかを判断するため。バッファ オーバーフロー攻撃を軽減します。

  • コンパイル オプション:
gcc -o test test.c                       //默认关闭
gcc -fno-stack-protector -o test test.c  //禁用栈保护
gcc -fstack-protector -o test test.c     //启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码
gcc -fstack-protector-all -o test test.c //启用堆栈保护,为所有函数插入保护代码
ログイン後にコピー

4. RELRO (RELocation Read Only)

Linux には 2 つの RELRO モードがあります: "Partial RELRO 「 および 「完全な RELRO」。 Linux では、部分的な RELRO がデフォルトで有効になっています。

部分的な RELRO:

  • コンパイル コマンド:
    gcc -o test test.c // デフォルトで部分的に有効になります
    gcc -Wl, - z,relro -o test test.c // RELRO の一部をオンにします
    gcc -z Lazy -o test test.c // パーツの一部をオンにします
  • ELF ファイルのさまざまな部分並べ替えられます。内部データ セクション (.got、.dtors など) はプログラムのデータ セクション (.data や .bss など) の前に配置されます。
  • no plt が指す GOT は読み取りのみです。
  • GOT テーブルを記述できます (上記とは異なるはずです)。

完全な RELRO:

  • コンパイル コマンド:
    gcc -Wl,-z,relro,-z,now -o test test.c // フル RELRO をオンにする
    gcc -z now -o test test.c / / すべて有効にする
  • Partial モードのすべての機能をサポート;
  • GOT テーブル全体が読み取り専用にマッピングされます。

gcc -z norelro -o a a.c // RELRO はオフ、つまり RELRO はありません

注:

  • .dtors: .dtors で定義された共有ライブラリがロードされるときに呼び出されます;
  • BSS エラーまたはデータ オーバーフロー エラーの場合、部分および完全 RELRO は ELF 内のデータ セグメントを保護します。上書きされてます。ただし、GOT テーブル上書き攻撃を軽減できるのは Full RELRO のみですが、プログラムは開始前にすべてのシンボルを解析する必要があるため、比較的コストがかかります。
  • 関連する推奨事項: 「Linux ビデオ チュートリアル

以上がLinux NXとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

CentosとUbuntuの違い CentosとUbuntuの違い Apr 14, 2025 pm 09:09 PM

Centosとubuntuの重要な違いは次のとおりです。起源(CentosはRed Hat、for Enterprises、UbuntuはDebianに由来します。個人用のDebianに由来します)、パッケージ管理(CentosはYumを使用し、安定性に焦点を当てます。チュートリアルとドキュメント)、使用(Centosはサーバーに偏っています。Ubuntuはサーバーやデスクトップに適しています)、その他の違いにはインストールのシンプルさが含まれます(Centos is Thin)

Dockerデスクトップの使用方法 Dockerデスクトップの使用方法 Apr 15, 2025 am 11:45 AM

Dockerデスクトップの使用方法は? Dockerデスクトップは、ローカルマシンでDockerコンテナを実行するためのツールです。使用する手順には次のものがあります。1。Dockerデスクトップをインストールします。 2。Dockerデスクトップを開始します。 3。Docker Imageを作成します(DockerFileを使用); 4. Docker画像をビルド(Docker Buildを使用); 5。Dockerコンテナを実行します(Docker Runを使用)。

メンテナンスを停止した後のCentosの選択 メンテナンスを停止した後のCentosの選択 Apr 14, 2025 pm 08:51 PM

Centosは廃止されました、代替品には次のものが含まれます。1。RockyLinux(最高の互換性)。 2。アルマリン(Centosと互換性); 3。Ubuntuサーバー(設定が必要); 4。RedHat Enterprise Linux(コマーシャルバージョン、有料ライセンス); 5。OracleLinux(CentosとRhelと互換性があります)。移行する場合、考慮事項は次のとおりです。互換性、可用性、サポート、コスト、およびコミュニティサポート。

Centosをインストールする方法 Centosをインストールする方法 Apr 14, 2025 pm 09:03 PM

Centosのインストール手順:ISO画像をダウンロードし、起動可能なメディアを燃やします。起動してインストールソースを選択します。言語とキーボードのレイアウトを選択します。ネットワークを構成します。ハードディスクをパーティション化します。システムクロックを設定します。ルートユーザーを作成します。ソフトウェアパッケージを選択します。インストールを開始します。インストールが完了した後、ハードディスクから再起動して起動します。

Dockerプロセスを表示する方法 Dockerプロセスを表示する方法 Apr 15, 2025 am 11:48 AM

Dockerプロセス表示方法:1。DockerCLIコマンド:Docker PS; 2。SystemDCLIコマンド:SystemCTL Status Docker; 3。CLIコマンドを作成するDocker:Docker-Compose PS。 4。プロセスエクスプローラー(Windows); 5。 /procディレクトリ(Linux)。

Dockerの原則の詳細な説明 Dockerの原則の詳細な説明 Apr 14, 2025 pm 11:57 PM

DockerはLinuxカーネル機能を使用して、効率的で孤立したアプリケーションランニング環境を提供します。その作業原則は次のとおりです。1。ミラーは、アプリケーションを実行するために必要なすべてを含む読み取り専用テンプレートとして使用されます。 2。ユニオンファイルシステム(UnionFS)は、違いを保存するだけで、スペースを節約し、高速化する複数のファイルシステムをスタックします。 3.デーモンはミラーとコンテナを管理し、クライアントはそれらをインタラクションに使用します。 4。名前空間とcgroupsは、コンテナの分離とリソースの制限を実装します。 5.複数のネットワークモードは、コンテナの相互接続をサポートします。これらのコア概念を理解することによってのみ、Dockerをよりよく利用できます。

Docker画像が失敗した場合はどうすればよいですか Docker画像が失敗した場合はどうすればよいですか Apr 15, 2025 am 11:21 AM

障害のあるDocker画像ビルドのトラブルシューティング手順:DockerFileの構文と依存関係バージョンを確認します。ビルドコンテキストに必要なソースコードと依存関係が含まれているかどうかを確認します。エラーの詳細については、ビルドログを表示します。 -targetオプションを使用して、階層フェーズを構築して障害点を識別します。 Dockerエンジンの最新バージョンを使用してください。 -t [image-name]:デバッグモードで画像を作成して、問題をデバッグします。ディスクスペースを確認し、十分であることを確認してください。 Selinuxを無効にして、ビルドプロセスへの干渉を防ぎます。コミュニティプラットフォームに助けを求め、DockerFilesを提供し、より具体的な提案のためにログの説明を作成します。

VSCODEに必要なコンピューター構成 VSCODEに必要なコンピューター構成 Apr 15, 2025 pm 09:48 PM

VSコードシステムの要件:オペレーティングシステム:オペレーティングシステム:Windows 10以降、MACOS 10.12以上、Linux Distributionプロセッサ:最小1.6 GHz、推奨2.0 GHz以上のメモリ:最小512 MB、推奨4 GB以上のストレージスペース:最低250 MB以上:その他の要件を推奨:安定ネットワーク接続、XORG/WAYLAND(Linux)

See all articles