1

我正在做一个家庭作业,我们要利用一个易受缓冲区溢出影响的程序。我们通过创建一个大char数组并首先在没有操作指令的情况下完全填充它来做到这一点。

我相信我应该做的是将恶意代码复制到缓冲区中的某个位置(这部分我可以做得很好),然后以某种方式修改可利用函数的返回地址,使其指向恶意代码所在的位置。

我知道我想设置的地址(比方说½¾¿º),但我收到了一些警告,但不知道它们是由什么引起的。

这是导致警告的代码(本质上):

int start_of_return_address = 10;
chars[start_of_return_address + 0] = '½';
chars[start_of_return_address + 1] = '¾';
chars[start_of_return_address + 2] = '¿';
chars[start_of_return_address + 3] = 'º';

我为每个作业收到的警告是:

warning: overflow in implicit constant conversion
warning: multi-character character constant

我通过将bdbebfba(恶意代码的地址)转换为字符(yielding ½¾¿º)来获得地址。

关于什么可能导致警告的任何想法,或者我可以将地址复制到字符数组中的另一种方式?

请记住,这是家庭作业。

4

2 回答 2

4

我认为您从字符转换bdbebfba为字符是可疑的。

如果那是地址,并且我想将其存储在字符数组中,我会这样做:

chars[start_of_return_address + 0] = 0xbd;
chars[start_of_return_address + 1] = 0xbe;
chars[start_of_return_address + 2] = 0xbf;
chars[start_of_return_address + 3] = 0xba;

它是一个 4 字节的值,因此可以容纳 4 个字符。

我认为字节序也很重要。如果系统是 little-endian (x86),则最低有效字节进入低地址(并且您颠倒分配顺序)。

chars[start_of_return_address + 4] = 0xbd;
chars[start_of_return_address + 3] = 0xbe;
chars[start_of_return_address + 2] = 0xbf;
chars[start_of_return_address + 1] = 0xba;
于 2012-04-11T10:59:29.810 回答
1

您向我们展示的字符文字('½', '¾', '¿', 'º')不应被解释为多字符常量。实际上,我的猜测是这是一个编码问题:例如,它们可以在源代码中编码为 UTF-8(因此编码为两个字节),但编译器期望另一种编码(如您假设的 Latin-1 - - 如果我是对的,它们被视为'½', '¾', '¿', 'º') ,因此认为常量中有两个字符。

于 2012-04-11T11:22:32.887 回答