36

我在编译以下漏洞利用代码时遇到问题:

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.)

我尝试在Kali LinuxUbuntu 10.04 (Lucid Lynx)上编译它们并得到相同的结果。

4

12 回答 12

26

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

在此处输入图像描述

于 2013-10-05T13:31:09.713 回答
18

您的来源中有无效字符。如果您的源代码中没有任何有效的非 ASCII 字符,可能是双引号字符串,您可以简单地将文件转换回 ASCII:

tr -cd '\11\12\15\40-\176' < old.c > new.c

带有 iconv 的方法将停止在没有意义的错误字符处。上面的命令行正在使用示例文件。

于 2013-10-05T13:45:33.557 回答
4

对于一个明显显示为星号的字符,我得到了相同的结果,但它是一个 UTF-8 序列:

Encoder * st;

编译后,它返回:

g.c:2:1: error: stray ‘\342’ in program
g.c:2:1: error: stray ‘\210’ in program
g.c:2:1: error: stray ‘\227’ in program

对于ASTERISK OPERATOR(Unicode 代码点 U+2217),342 210 227 原来是 UTF-8 。

删除“*”并再次键入它可以解决问题。

于 2016-07-21T09:51:07.513 回答
4

当然,将文件转换为 ASCII 并删除所有 Unicode 字符。 它可能会工作...... 但是......

  1. 你不会知道你修复了什么。
  2. 它还将破坏任何 Unicode 注释。示例: //: A²+B²=C²
  3. 它可能会破坏明显的逻辑并且代码仍然会被破坏,但解决方案不太明显。例如:带有“Smart-Quotes”(“ & ”)的字符串或带有全角星号(*)的指针。现在“SOME_THING”看起来像 #define (SOME_THING) 并且 *SomeType 是错误的类型 (SomeType)。

解决问题的另外两种手术方法:

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

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

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

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

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

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

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

例子:

不知何故,我的代码中有一个要点 (•)。Unicode 值为 2022(十六进制),但当编译器将其读取为 ASCII 时,您会得到 \342 \200 \242(3 个八进制值)。这不像将每个八进制值转换为十六进制并将它们粉碎在一起那么简单。所以“E2 80 A2”不是代码中的十六进制 Unicode 点。

于 2019-01-24T18:01:43.823 回答
2

每当编译器发现一个特殊字符时,它就会给出这些类型的编译错误。我发现的错误如下:

错误:程序中的杂散“\ 302”和错误:程序中的杂散“\ 240”

……

这是我从聊天信使那里复制的一段代码。在Facebook Messenger中,它只是一个特殊字符。复制到 Vim 编辑器后,它只更改为正确的字符。但是编译器给出了上述错误..然后..我在之后手动编写的那条语句..它得到了解决... :)

于 2015-08-20T05:55:19.260 回答
2

这可能是因为您从 Internet 上复制了代码(从一个可能没有 ASCII 编码页面,而是 UTF-8 编码页面的站点),所以您可以从该站点将代码转换为 ASCII:

“http://www.percederberg.net/tools/text_converter.html”

在那里,您可以通过将其转换回 UTF-8 来手动检测错误,也可以自动将其转换为 ASCII 并删除所有杂散字符。

于 2016-02-03T11:14:25.017 回答
1

当您从 HTML 页面复制一些文本或在 Windows 环境中进行了修改并尝试在 Unix/Solaris 环境中编译时,就会出现此问题。

请执行“ dos2unix ”从文件中删除特殊字符:

dos2unix fileName.ext fileName.ext
于 2015-08-05T13:05:23.793 回答
1

代码中的无效字符

这是一种常见的复制粘贴错误,尤其是从Microsoft Word文档或 PDF 文件复制代码时。

于 2019-04-20T10:25:02.573 回答
0

Codo 在 10 月 5 日是完全正确的,&current[i]是预期的文本(在将源放入 HTML 时无意中引入了货币符号(参见原文):

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

Codo 的改变使这个漏洞利用代码编译没有错误。我这样做了,并且能够使用Ubuntu 12.04(Precise Pangolin)上的漏洞来升级到 root 权限。

于 2013-11-14T08:35:31.410 回答
0

这里给出的解释是正确的。我只是想补充一点,这个问题可能是因为您从某个地方、网站或 PDF 文件中复制了代码,因此代码中有一些无效字符。

尝试找到那些无效字符,或者如果找不到,就重新输入代码。它肯定会编译。

来源:杂散错误原因

于 2014-04-27T05:02:54.230 回答
0

对我来说,当我将文本格式的代码复制并粘贴到我的编辑器 ( gedit ) 时,就会发生此错误。

该代码位于文本文档 (.odt) 中。我将它复制并粘贴到 gedit 中。

如果你做了同样的事情,你已经手动重写了代码。

于 2014-07-08T15:54:10.250 回答
0

我注意到使用上述 tr 命令时出现问题。tr 命令完全删除“智能引号”用这样的东西替换“智能引号”会更好。

这将使您快速预览将被替换的内容。

sed s/[”“]/'"'/g File.txt

这将执行替换并将替换放入名为WithoutSmartQuotes.txt 的新文件中。

sed s/[”“]/'"'/g File.txt > WithoutSmartQuotes.txt

这将覆盖原始文件。

sed -i ".bk" s/[”“]/'"'/g File.txt

http://developmentality.wordpress.com/2010/10/11/how-to-remove-smart-quotes-from-a-text-file/

于 2014-11-13T13:19:58.250 回答