web-dev-qa-db-ja.com

ASLRがテキストセクションをランダム化しないようです

Linux ASLRでいくつかの基本的なテストを行いたかったので、次のコードを書きました。

#include <stdio.h>

void funct(){
    int a= 0;
}

void main(){
    int b=0;
    printf("funct : %p\n", &funct);
    printf("var stack : %p\n", &b);
}

このコードを実行すると、2番目のポインター(スタック上の値を指す)は、ある実行から別の実行に変更されたときにランダム化されたように見えますが、最初のポインターはランダム化されていません。

-fPIC gccオプションを使用してコンパイルしようとしましたが、どちらも機能しません。

また、/ proc/sys/kernel/randomize_va_spaceが2であることを確認しました。

誰かが私が間違っていることを説明できますか?

3
Chocosup

テキストセグメントは通常、ASLR実装ではランダム化されていません。これが Return-Oriented Programming(ROP)チェーン が機能する理由です。アイデアは、アプリケーション自体のコードは「安全」でなければならないということです。そのため、このメモリ空間をランダム化すると、リソースの無駄になります。

ROPチェーンとは、アプリケーション自体の機能を使用して悪意のあるペイロードを構築することです。適切な例えは、適切な意味のある文を取り、特定の文字または単語を選択して新しい意味を作ることで侮辱することができるということです。

5
rook