【问题标题】:Convert int to string in hex format将 int 转换为十六进制格式的字符串
【发布时间】:2013-05-21 18:47:27
【问题描述】:

当我尝试像这篇文章: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");
}

我想将堆栈指针转换为十六进制字符*,这样我就可以像这样执行 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 和 google 并找不到任何东西。提前感谢您的帮助!

【问题讨论】:

  • sprintfprintf 一样工作,但将其结果放在字符串中。

标签: c string int hex stack-smash


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-08
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    相关资源
    最近更新 更多