当我尝试像本文http://www.cs.wright.edu/people/faculty/tkprasad/courses/cs781/alephOne.html那样尝试进行粉碎堆叠漏洞利用时,我遇到了需要将堆栈指针转换为字符串的问题。
我知道如何以十六进制格式打印出一个int(使用printf),但不知道如何将它作为内部字符串表示形式存储。我需要将其作为字符串存储在内部,以便将其传递给memcpy函数。
我需要的理论功能是下面的“convertFromIntToHexCharStar”。
unsigned long NOPSledPointer = get_sp() + 150;
char * address = convertFromIntToHexCharStar(NOPSledPointer);
它打算使用此函数作为参数。它给出了堆栈指针。
unsigned long get_sp(void) {
__asm__("movl %esp,%eax");
}
我想将堆栈指针转换为十六进制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);
我需要用十六进制表示的地址填充内存,因为我知道它在过去有效。
所以,我要求的是帮助将它转换为字符串,或者另一种更简单的方法来做这个NOP雪橇(这是我试图解决的真正问题)。我打算多次填写地址,因此它增加了覆盖堆栈上返回地址的几率,但为了简洁起见,我只给了一行代码将“地址”写入“缓冲区”。
我已经搜索过stackoverflow&谷歌,找不到任何东西。在此先感谢您的帮助!
答案 0 :(得分: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;
}