【问题标题】:ld.exe: unrecognized option '-z'ld.exe:无法识别的选项“-z”
【发布时间】:2019-08-20 11:35:56
【问题描述】:

我遵循了这个Buffer Overflow Exploit tutorial 并在我的mingw32.exe 中编写了一个小应用程序来使用gcc 进行编译。但是,当我这样做时,出现以下错误:

Liu.D.H@DESKTOP-KA8TQF4 MINGW32 ~
$ gcc vuln.c -o vuln -fno-stack-protector -m32 -z execstack
C:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.3.0/../../../../i686-w64-mingw32/bin/ld.exe: unrecognized option '-z'
C:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.3.0/../../../../i686-w64-mingw32/bin/ld.exe: use the --help option for usage information
collect2.exe: error: ld returned 1 exit status

Liu.D.H@DESKTOP-KA8TQF4 MINGW32 ~
$ gcc -c vuln.c -o vuln -fno-stack-protector -m32 -z execstack

Liu.D.H@DESKTOP-KA8TQF4 MINGW32 ~
$ ld -z execstack vuln.o -o vuln
C:\msys32\mingw32\bin\ld.exe: unrecognized option '-z'
C:\msys32\mingw32\bin\ld.exe: use the --help option for usage information

Liu.D.H@DESKTOP-KA8TQF4 MINGW32 ~
$ ld -v
GNU ld (GNU Binutils) 2.30

Liu.D.H@DESKTOP-KA8TQF4 MINGW32 ~
$ C:/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/7.3.0/../../../../i686-w64-mingw32/bin/ld.exe -v
GNU ld (GNU Binutils) 2.30

Liu.D.H@DESKTOP-KA8TQF4 MINGW32 ~
$

我可以在man ld 中找到execstack 选项以及上面匹配的版本。

【问题讨论】:

  • 您链接到的代码适用于 Linux,但您似乎正在尝试在 Windows 上使用它?
  • @PaulR 是的,我用msys2编译代码,是类似Linux的环境,不用-z execstack选项也可以编译运行。

标签: gcc mingw ld msys2


【解决方案1】:

Windows gcc/ld 似乎不支持 -z 选项(至少我的版本不支持)。我的猜测是这里的选项真的只在 Linux 上有意义。这让我想到了-z execstack 选项(不是同名的Linux tool),它告诉ld 关闭程序上的数据执行保护(DEP)。这是通过 ELF 可执行文件中的标志完成的。

另一方面,Windows DEP policy 由操作系统处理。您可以像这样为 Windows 10 上的单个程序管理它:

  1. 在“开始”菜单中查找“调整 Windows 的外观和性能”。 (您可以键入“性能”,它会出现)。这会为您提供一个新对话框。
  2. 转到第三个选项卡“数据执行保护”。
  3. 在此处添加/删除异常

或者您可以通过 CMD 使用bcdedit 来全局打开/关闭 DEP,但这是一个坏主意。引用文章:

重要提示 DEP 是一种高效的安全功能,除非您别无选择,否则不应禁用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-21
    • 2020-07-02
    • 2018-02-06
    • 2021-11-08
    • 2017-02-14
    • 2022-06-17
    • 2022-10-12
    • 1970-01-01
    相关资源
    最近更新 更多