C - 如何 (*(void (*)()) 代码); 在没有任何调用的情况下在 C 程序中运行

伦尼特宝贝

要在 C 程序中运行任意组装的十六进制指令,通常需要将数据转换为函数指针,然后调用这样的指针。

常见用法

int main(){    
    void (*ret)() = (void(*)())code;
    ret();
    return 0;
}

但是,我也遇到了另一种实现相同任务的方法

问题案例

int main() {
    (*(void (*)()) code);
    return 0;
}

有人可以帮忙解释一下:

  1. 两种情况的区别
  2. 第二种情况如何在没有任何调用的情况下工作

当在没有实际调用第二种情况的脚本中的十六进制代码的情况下难以在 GDB 等调试器中跟踪十六进制指令代码时,就会出现问题。

编辑

测试的程序是用 gcc 编译的,并带有以下选项: -fno-stack-protector -z exexcstack

机器测试和 gcc 版本:

gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04)
普科奇克

第二段代码不起作用。未使用的 deref 是空操作。它相当于一个空函数。如果你想避免变量使用((void (*)())code)().

例子:

extern char *code;
void run()
{
    void (*ret)() = (void(*)())code;
    ret();
}
void run0()
{
    (*(void (*)()) code);
}
void empty()
{
}
void novar()
{
    ((void (*)())code)();
}

示例的反汇编 (x86_64):

ex.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <run>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   48 83 ec 10             sub    $0x10,%rsp
   8:   48 8b 05 00 00 00 00    mov    0x0(%rip),%rax        # f <run+0xf>
   f:   48 89 45 f8             mov    %rax,-0x8(%rbp)
  13:   48 8b 55 f8             mov    -0x8(%rbp),%rdx
  17:   b8 00 00 00 00          mov    $0x0,%eax
  1c:   ff d2                   callq  *%rdx
  1e:   90                      nop
  1f:   c9                      leaveq 
  20:   c3                      retq   

0000000000000021 <run0>:
  21:   55                      push   %rbp
  22:   48 89 e5                mov    %rsp,%rbp
  25:   90                      nop
  26:   5d                      pop    %rbp
  27:   c3                      retq   

0000000000000028 <empty>:
  28:   55                      push   %rbp
  29:   48 89 e5                mov    %rsp,%rbp
  2c:   90                      nop
  2d:   5d                      pop    %rbp
  2e:   c3                      retq   

000000000000002f <novar>:
  2f:   55                      push   %rbp
  30:   48 89 e5                mov    %rsp,%rbp
  33:   48 8b 05 00 00 00 00    mov    0x0(%rip),%rax        # 3a <novar+0xb>
  3a:   48 89 c2                mov    %rax,%rdx
  3d:   b8 00 00 00 00          mov    $0x0,%eax
  42:   ff d2                   callq  *%rdx
  44:   90                      nop
  45:   5d                      pop    %rbp
  46:   c3                      retq   

https://gcc.godbolt.org/z/lEo5ga

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

c - 如何在没有`scanf()`的情况下在c中获取整数和浮点输入?

来自分类Dev

如何在没有警告的情况下在C99中使用ftruncate

来自分类Dev

C#-如何在没有BindingSource的情况下在DataGridView中搜索和过滤

来自分类Dev

如何在没有特殊选择的情况下在 c# winforms 中获得按键

来自分类Dev

如何在没有数学库的情况下在 C++ 中创建复利公式?

来自分类Dev

在没有Web参考的情况下在C#中调用Web方法

来自分类Dev

如何在没有任何加载项的情况下在Outlook 2010中编辑电子邮件的HTML源代码?

来自分类Dev

为什么代码“x++ && y++;” 在没有控制运算符的情况下在 C 中工作?

来自分类Dev

有没有办法在不使用void指针的情况下返回C函数中的任何类型?

来自分类Dev

如何在没有其他文件影响的情况下在Visual Studio项目中“单独”运行C ++文件?

来自分类Dev

我想在没有任何函数的情况下在 C# 中按升序对矩阵进行排序

来自分类Dev

在没有任何JavaScript知识的情况下,如何在PNaCl中编写C ++ HTML5应用程序?

来自分类Dev

如何在没有外部依赖关系的情况下在Python中实现类似C的unsigned int 32?

来自分类Dev

如何在没有外部依赖关系的情况下在Python中实现类似C的unsigned int 32?

来自分类Dev

如何在没有 wchar_t 的情况下在 C++ 中解码/编码 UTF-8 字符

来自分类Dev

如何在没有0x0d的情况下在C中输出0x0a?

来自分类Dev

C 代码是如何运行的?

来自分类Dev

在没有MSVCRT运行时的情况下在Visual Studio 2012中编译C

来自分类Dev

如何在没有 gcc 编译器的情况下在 docker 中打包和发布一个简单的 c 应用程序?

来自分类Dev

如何在没有代码隐藏的情况下在ViewModel中处理WPF路由命令?

来自分类Dev

如何在没有页面终止的情况下在 PHP 中设置标头 HTTP 代码?

来自分类Dev

我可以在没有项目设置的情况下在 c# 代码中#define 一个常量解决方案吗?

来自分类Dev

如何在Raspberry Pi上没有操作系统的情况下运行C程序?

来自分类Dev

无法在代码块中的多个文件中运行带有类的任何C ++程序

来自分类Dev

如何在Heroku中运行C ++代码?

来自分类Dev

C++ 如何在不显式转换的情况下在函数调用中降级类实例?

来自分类Dev

如何在不重复 c# 中的代码的情况下在 ViewModel 上创建可变长度下拉列表?

来自分类Dev

如何在Android中不使用Xamarin的情况下使用Mono运行C#代码?

来自分类Dev

如何从C#代码中调用网址

Related 相关文章

  1. 1

    c - 如何在没有`scanf()`的情况下在c中获取整数和浮点输入?

  2. 2

    如何在没有警告的情况下在C99中使用ftruncate

  3. 3

    C#-如何在没有BindingSource的情况下在DataGridView中搜索和过滤

  4. 4

    如何在没有特殊选择的情况下在 c# winforms 中获得按键

  5. 5

    如何在没有数学库的情况下在 C++ 中创建复利公式?

  6. 6

    在没有Web参考的情况下在C#中调用Web方法

  7. 7

    如何在没有任何加载项的情况下在Outlook 2010中编辑电子邮件的HTML源代码?

  8. 8

    为什么代码“x++ && y++;” 在没有控制运算符的情况下在 C 中工作?

  9. 9

    有没有办法在不使用void指针的情况下返回C函数中的任何类型?

  10. 10

    如何在没有其他文件影响的情况下在Visual Studio项目中“单独”运行C ++文件?

  11. 11

    我想在没有任何函数的情况下在 C# 中按升序对矩阵进行排序

  12. 12

    在没有任何JavaScript知识的情况下,如何在PNaCl中编写C ++ HTML5应用程序?

  13. 13

    如何在没有外部依赖关系的情况下在Python中实现类似C的unsigned int 32?

  14. 14

    如何在没有外部依赖关系的情况下在Python中实现类似C的unsigned int 32?

  15. 15

    如何在没有 wchar_t 的情况下在 C++ 中解码/编码 UTF-8 字符

  16. 16

    如何在没有0x0d的情况下在C中输出0x0a?

  17. 17

    C 代码是如何运行的?

  18. 18

    在没有MSVCRT运行时的情况下在Visual Studio 2012中编译C

  19. 19

    如何在没有 gcc 编译器的情况下在 docker 中打包和发布一个简单的 c 应用程序?

  20. 20

    如何在没有代码隐藏的情况下在ViewModel中处理WPF路由命令?

  21. 21

    如何在没有页面终止的情况下在 PHP 中设置标头 HTTP 代码?

  22. 22

    我可以在没有项目设置的情况下在 c# 代码中#define 一个常量解决方案吗?

  23. 23

    如何在Raspberry Pi上没有操作系统的情况下运行C程序?

  24. 24

    无法在代码块中的多个文件中运行带有类的任何C ++程序

  25. 25

    如何在Heroku中运行C ++代码?

  26. 26

    C++ 如何在不显式转换的情况下在函数调用中降级类实例?

  27. 27

    如何在不重复 c# 中的代码的情况下在 ViewModel 上创建可变长度下拉列表?

  28. 28

    如何在Android中不使用Xamarin的情况下使用Mono运行C#代码?

  29. 29

    如何从C#代码中调用网址

热门标签

归档