2013-05-26 164 views
2

雖然我正在嘗試像這篇文章:http://www.cs.wright.edu/people/faculty/tkprasad/courses/cs781/alephOne.html一樣進行碎片堆棧利用,但遇到了需要將堆棧指針轉換爲字符串的問題。將int轉換爲十六進制格式的字符串

我知道如何以十六進制格式(使用printf)打印int,但不知道如何將其作爲內部字符串表示形式存儲。我需要將它內部存儲爲一個字符串,以便將其傳遞到memcpy函數中。

我需要的理論函數是下面的「convertFromIntToHexCharStar」。

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

它旨在使用此函數作爲參數。它給出堆棧指針。

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

我想堆棧指針轉換爲十六進制字符*所以我可以做的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); 

我需要填寫與十六進制表示的地址的記憶,因爲我知道它在過去有效。

所以,我要求的是幫助將其轉換爲字符串,或另一種更簡單的方法來做到這一點NOP雪橇(這是我真正想要解決的問題)。我要多次填寫地址,這樣會增加覆蓋堆棧上返回地址的機率,但爲了簡潔起見,我只給出了將「address」寫入「buffer」的一行代碼。

我已經搜索過stackoverflow &谷歌,找不到任何東西。在此先感謝您的幫助!

+1

'sprintf'就像'printf'一樣工作,但將結果放入字符串中。 – Gene

回答

1

snprintf解決了我的問題,因爲我知道堆棧指針的大小是4字節。

這個網站幫助了我: 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; 
} 
相關問題