【问题标题】:How to Fix Multi-Character Constant Warning如何修复多字符常量警告
【发布时间】:2012-04-11 10:26:04
【问题描述】:

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

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

请记住,这是家庭作业。

【问题讨论】:

  • 您是如何将bdbebfba 转换为“字符”的?

标签: c arrays character-encoding char


【解决方案1】:

我认为您从 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;

【讨论】:

  • 就是这样!谢谢!这种字节序确实是一个重要因素(第二组代码有效),所以也感谢您进行编辑。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-09-12
    • 1970-01-01
    • 2011-12-06
    • 2014-07-01
    • 2013-12-13
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多