当前位置: 首页 > 面试题库 >

在Go中执行字节数组

臧翰采
2023-03-14
问题内容

我正在尝试在Go程序中执行shellcode,类似于您如何使用其他语言来执行它。

示例- http://www.debasish.in/2012/04/execute-shellcode-using-
python.html

所有方法都具有大致相似的技术-
通过操作系统特定的分配(mmap,virtualalloc等)将shellcode分配给可执行内存,然后通过在执行之前创建指向该位置的函数指针来执行代码。

这是我在Go中执行相同操作的可怕示例。shellcode在传递给函数之前已对其执行了一些操作,因此其格式为[]
byte是固定的。说mmap期望传入一个文件描述符,这就是为什么存在可怕的“写入tmp文件”部分的原因。

func osxExec(shellcode []byte) {
    f, err := os.Create("data/shellcode.tmp")
    if err != nil {
        fmt.Println(err)
    }
    defer f.Close()
    _,_ = f.Write(shellcode)
    f.Sync()

    b, err := syscall.Mmap(int(f.Fd()), 0, len(shellcode), syscall.PROT_READ|syscall.PROT_WRITE|syscall.PROT_EXEC, syscall.MAP_SHARED)
    if err != nil {
        fmt.Println(err)
    }

    fmt.Printf("%p", b)
}

在代码的末尾,我以为假定的代码为可执行文件内存指向代码(切片?),但是我不知道如何将该地址转换为函数指针以便执行。我在一些IRC频道上询问过,但有人建议这可能是不可能的。

任何帮助是极大的赞赏。

干杯。


问题答案:

有多种方法可以做到这一点,尽管我自己还没有对其进行测试。

您可能想看看https://github.com/nelhage/gojit/blob/master/jit.go。
它实现了基于cgo的解决方案(比较安全,但速度较慢)和基于直接的解决方案。呼叫。查看所有与构建相关的功能。



 类似资料:
  • 问题内容: 我有一个带有字段的结构类型。 在代码的某个时刻,我想声明一个字面值(例如,当我知道值应该为0或指向0时,您就知道我的意思了) …除非这不起作用 所以我尝试这个 …但是这也不起作用 我该怎么做呢?我唯一能想到的解决方案是使用占位符变量 注意: 当使用 int而不是时, 语法可以 正常 工作 。 编辑:不,不。为此表示歉意。 编辑: 显然,我的问题含糊不清。我正在寻找一种方式来 字面上状态

  • 问题内容: 有什么方法可以从C#执行Go函数吗?对于Python,我将使用Ironpython为例。 我知道我可以产生一个执行Go脚本的过程,但是如果可能的话,我真的不想回退到这种解决方案。 Google搜索没有显示任何内容,因此有什么方法可以使用API​​做到这一点?还是我必须回退流程? 问题答案: 编辑:我的答案现在是不正确的,因为自从我发布以来,Go已经更新。 这个stackoverflow

  • 问题内容: 我正在寻找在Go中执行shell命令,并在程序中以字符串形式获取结果输出。我看到了Rosetta Code 版本: 但这并不能以我可以通过编程方式访问的方式捕获实际的标准或错误-那些仍会打印到常规的stdout / stderr。我看到使用Pipe作为out或err可以在其他地方提供帮助,但是没有如何执行此操作的示例。有任何想法吗? 问题答案: 该答案不代表Go标准库的当前状态。请查看

  • 字节码的解释执行和AST的解释执行有类似之处,而且更简单,因为树形结构已经展开成顺序了,以栈虚拟机为例,为方便起见,假设所有的指令都在一个指令数组里,每个元素是一个指令对象,有code和arg两个属性,解释器入口: Object execute(Inst[] inst_list, Object[] func_arg); 由于continue和break已经被jmp指令代替了,这里我们认为exec

  • 问题内容: 我的成员有一个结构,我正在用编写它。麻烦的是,它将s解释为s,并且它输出字符串而不是数字数组。 如果它是,我可以使它工作,但是如果可以避免的话,我不想分配和复制这些项目。我可以吗? 问题答案: 根据文档,a 将被编码为Base64字符串。 “数组和切片值编码为JSON数组, 除了[] byte编码为base64编码的字符串 ,而nil slice编码为空JSON对象。” 因此,我认为您

  • 问题内容: 我有一个包含单元测试的Go文件,其中一些使用了公共变量。我正在测试的代码中使用了另一个全局变量。所有这些都可能导致问题。 在Go中,当我们执行位于同一文件中的测试时,它们如何运行?并行还是下一个不会在前一个完成之前开始? 问题答案: 测试起来真的很容易: 使用运行它,输出显示它是顺序的: 因此,正常的测试是依次执行的,但是请不要忘记未定义顺序:如何依次运行golang测试? 还要注意,