如何修复多字符常量警告

时间:2012-04-11 10:26:04

标签: c arrays character-encoding char

我正在做一项家庭作业,我们将利用容易受缓冲区溢出影响的程序。我们通过创建一个大的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(恶意代码的地址)转换为字符(产生½¾¿º)来获取地址。

关于可能导致警告的内容的任何想法,或者我可以将地址复制到字符数组中的其他方式?

请记住,这是作业。

2 个答案:

答案 0 :(得分: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个字符。

我认为endian-ness也很重要。如果系统是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;

答案 1 :(得分:1)

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