编译错误:在程序等中迷路'\ 302'

Ahm*_*her 31 c compiler-construction

我在编译后面的漏洞利用代码时遇到问题:

http://downloads.securityfocus.com/vulnerabilities/exploits/59846-1.c

我正在使用:"gcc file.c"和"gcc -O2 file.c",但它们都会出现以下错误:

 sorbolinux-exec.c: In function ‘sc’:
 sorbolinux-exec.c:76: error: stray ‘\302’ in program
 sorbolinux-exec.c:76: error: stray ‘\244’ in program
 sorbolinux-exec.c:76: error: ‘t’ undeclared (first use in this function)
 sorbolinux-exec.c:76: error: (Each undeclared identifier is reported only  once
 sorbolinux-exec.c:76: error: for each function it appears in.)
Run Code Online (Sandbox Code Playgroud)

我尝试在Kali linux和Ubuntu 10.04上编译它们并得到相同的结果.

Yu *_*Hao 23

您在该行上有一个无效字符.这就是我所看到的:

在此输入图像描述

  • 很可能是`uint64_t*p =(void*)¤t[i];`这一行需要改为`uint64_t*p =(void*)&current [i];`.(`¤`是货币符号的HTML实体. (4认同)

Kla*_*aus 14

您的来源中包含无效字符.如果您的源中没有任何有效的非ascii字符,可能是双引号字符串文字,您只需将文件转换回ascii:

tr -cd '\11\12\15\40-\176' < old.c > new.c
Run Code Online (Sandbox Code Playgroud)

编辑:iconv的方法将停在错误的字符,这是没有意义的.上面的命令行正在使用示例文件.祝好运 :-)


J.M*_*SON 6

当然,将文件转换为 ASCII 并清除所有 Unicode 字符。\n它可能会起作用... 但是...

\n
    \n
  1. 你不会知道你修复了什么。
  2. \n
  3. 它还会破坏所有 Unicode 注释。示例: //: A\xc2\xb2+B\xc2\xb2=C\xc2\xb2
  4. \n
  5. 它可能会损坏明显的逻辑,并且代码仍然会被破坏,\n但解决方案不太明显。\n例如:带有“智能引号”的字符串 (\xe2\x80\x9c & \xe2\x80\x9d) 或带有全角星号的指针 (\xef\xbc\x8a)。现在 \xe2\x80\x9cSOME_THING\xe2\x80\x9d 看起来像 #define (SOME_THING),而 \xef\xbc\x8aSomeType 是错误的类型 (SomeType)。
  6. \n
\n

还有两种手术方法可以解决这个问题:

\n
    \n
  1. 切换字体以查看字符。(它可能在您当前的字体中不可见)

    \n
  2. \n
  3. 正则表达式搜索不属于非扩展 ASCII 的所有 Unicode 字符。

    \n

    Notepad++中,我最多可以搜索 FFFF,这还没有让我失望。

    \n

    [\\x{80}-\\x{FFFF}]

    \n

    80 是 128 的十六进制,第一个扩展 ASCII 字符。

    \n

    点击“查找下一个”并突出显示空白区域后,您可以关闭搜索对话框并按Ctrl+C复制到剪贴板。

    \n

    然后将字符粘贴到 Unicode 搜索工具中。\n我通常使用在线工具。\n http://unicode.scarfboy.com/

    \n
  4. \n
\n

例子:

\n

我的代码中有一个项目符号点 (\xe2\x80\xa2)。\nUnicode 值是 2022(十六进制),但是当编译器读取为 ASCII 时\n你会得到 \\342 \\200 \\242 (3八进制值)。它并不像将每个八进制值转换为十六进制并将它们粉碎在一起那么简单。所以“E2 80 A2”不是代码中的十六进制 Unicode 点。

\n