2

http://www.cs.wright.edu/people/faculty/tkprasad/courses/cs781/alephOne.htmlの記事のようにスマッシュ スタッキング エクスプロイトを実行しようとしているときに、次のようにする必要があるという問題に遭遇しました。スタック ポインタを文字列に変換します。

(printf を使用して) int を 16 進形式で出力する方法は知っていますが、内部文字列表現として格納する方法は知りません。memcpy 関数に渡すことができるように、文字列として内部的に保存する必要があります。

私が必要とする理論上の関数は、以下の「convertFromIntToHexCharStar」です。

unsigned long NOPSledPointer = get_sp() + 150;
char * address = convertFromIntToHexCharStar(NOPSledPointer);

この関数を引数として使用することを意図しています。スタックポインタを提供します。

unsigned long get_sp(void) {
    __asm__("movl %esp,%eax");
}

スタック ポインターを 16 進数の char* に変換したいので、次のように memcpy を実行できます。

char buffer[517];   

/* Initialize buffer with 0x90 (NOP instruction) */
memset(&buffer, 0x90, 517);

/* Fill the buffer with appropriate contents here */ 
 memcpy((void*) buffer, (void*) address, 4);

過去に機能したことがわかっているため、16 進数で表されたアドレスをメモリに入力する必要があります。

したがって、私が求めているのは、それを文字列に変換するか、この NOP スレッドを実行する別の簡単な方法 (これが私が解決しようとしている私の本当の問題です) のいずれかです。アドレスを複数回入力するつもりだったので、スタック上の戻りアドレスを上書きする可能性が高くなりますが、簡潔にするために、「アドレス」を「バッファー」に書き込むコードは 1 行だけにしました。

私はすでにstackoverflowとgoogleを検索しましたが、何も見つかりませんでした。よろしくお願いします。

4

1 に答える 1

1

スタックポインタのサイズが4バイトであることが事前にわかっているため、snprintfは私の問題を解決しました。

このサイトが役に立ちました: http://www.cplusplus.com/reference/cstdio/snprintf/

そして、これが以下のコードソリューションであり、正しく機能することを確認するために使用したいくつかの印刷ステートメントがあります。

#include <stdio.h>

unsigned long get_sp(void) 
{
   __asm__("movl %esp,%eax");
}


int main()
{
    unsigned long numberToConvert = get_sp();
    char address[9];
    snprintf(address, 9, "%08lX", numberToConvert);

    printf("Number To Convert: %lu \n", numberToConvert);
    printf("Expected hex number: %08lX \n", numberToConvert);
    printf("Actual hex number: %s \n", address);

    return 0;
}
于 2013-05-28T23:13:06.880 に答える