在 Go 中执行字节数组

2024-05-08

我正在尝试在 Go 程序中执行 shellcode,类似于使用其他语言执行此操作的方式。

示例 1 -C 程序中的 Shellcode https://stackoverflow.com/questions/16626857/shellcode-in-c-program

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

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

这是我在 Go 中执行相同操作的可怕的 hacky 示例。 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 频道上询问过,但有人建议这可能不可能。

任何帮助是极大的赞赏。

Cheers.


首先,您(当前)不需要使用mmap根本没有,因为 go 内存是可执行的。如果你确实需要mmap,您可以使用匿名内存并放弃临时文件:

b, e := syscall.Mmap(0, 0, len(shellcode), syscall.PROT_READ|syscall.PROT_WRITE|syscall.PROT_EXEC, syscall.MAP_ANON)
copy(b, shellcode)

否则,您可以尝试使用shellcode直接,因为它已经由连续数组支持。

至于转换中的字节shellcode对于一个函数,C 中的模拟如下:

f := *(*func() int)(unsafe.Pointer(&d[0]))

它创建一个名为的函数值f然后可以像普通函数一样调用它。

如果 shellcode 不是专门从 Go 编写的,并且您需要从 C 堆栈调用它,那么使用 cgo 直接在 C 中执行会更容易。

/*
call(char *code) {
    int (*ret)() = (int(*)())code;
    ret();
}
*/
import "C"

func main() {
    ...
    // at your call site, you can send the shellcode directly to the C 
    // function by converting it to a pointer of the correct type.
    C.call((*C.char)(unsafe.Pointer(&shellcode[0])))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Go 中执行字节数组 的相关文章

  • 为什么 json.Unmarshal 返回映射而不是预期的结构?

    看看这个游乐场 http play golang org p dWku6SPqj5 http play golang org p dWku6SPqj5 基本上 我正在工作的图书馆收到了interface 作为参数 然后需要json Unma
  • 直接从一个通道发送到另一个通道

    当从一个通道直接发送到另一个通道时 我偶然发现了令人惊讶的行为 package main import fmt func main my chan make chan string chan of chans make chan chan
  • os.Mkdir 和 os.MkdirAll 权限

    我正在尝试在程序开始时创建一个日志文件 我需要检查是否 log如果不创建目录 则目录存在 然后继续创建日志文件 好吧 我尝试使用os Mkdir 也os MkdirAll 但无论我在第二个参数中输入什么值 我都会得到一个没有权限的锁定文件夹
  • 如何仅在测试时允许一个包访问另一个包的未导出数据?

    In Go 编程语言 第 11 2 4 节 有一个外部测试访问的示例fmt isSpace 通过声明IsSpace in fmt s export test go文件 这似乎是完美的解决方案 所以这就是我所做的 a a go package
  • 如何确定 go 中当前运行的可执行文件的完整路径?

    我一直在 osx 上使用这个函数 Shortcut to get the path to the current executable func ExecPath string var here os Args 0 if strings H
  • 错误:标准包中非标准导入“gopkg.in/yaml.v2”

    我正在尝试从以下位置导入 go yamlhttps github com go yaml yaml https github com go yaml yaml 并且我发现了一个 Google 没有提供帮助的错误 I ran go get g
  • Go客户端程序生成大量TIME_WAIT状态的socket

    我有一个 Go 程序 它从多个 goroutine 生成大量 HTTP 请求 运行一段时间后 程序报错 connect cannot allocaterequestedaddress 当检查时netstat 我得到大量 28229 个连接T
  • 如何在 Go 中填写 void* C 指针?

    我正在尝试与 Go 中的一些 C 代码交互 使用 cgo 这一直相对简单 直到我遇到这种 相当常见 的情况 需要将指针传递给本身包含指向某些数据的指针的结构 我似乎无法弄清楚如何从 Go 中做到这一点 而不诉诸于将结构的创建放入 C 代码本
  • 测试 gRPC 服务

    我想测试用 Go 编写的 gRPC 服务 我使用的示例是 Hello World 服务器示例grpc go 仓库 https github com grpc grpc go blob master examples helloworld g
  • go json marshal 的默认大小写选项?

    我有以下结构要导出为 json type ExportedIncident struct Title string json title Host string json host Status string json status Dat
  • C 中的函数指针和枚举

    我正在寻找一种链接函数指针和枚举的奇特方法 就我而言 我有一个消息队列 其中包含事件 ID 和与事件关联的一些数据 一些简单的伪代码 event eid data switch eid case eid1 handler1 data bre
  • Golang const unsafe.Sizeof

    不明白为什么我可以做到 const OK uint64 0 const OK int unsafe Sizeof uint64 0 但不是这个 const NOK binary Size uint64 0 它的解释在规格 https gol
  • 函数指针声明语法混乱[重复]

    这个问题在这里已经有答案了 我已经阅读并搜索了有关解码函数指针的右左规则 For ex int fun one char double 9 20 is fun one 是指向函数的指针 需要 char double 和 返回指向 int 数
  • 所有可能的 GOOS 价值?

    如果我做对了 GOOS在编译源代码时确定 为了更好地支持多个操作系统 我感兴趣的是GOOS可能 当然 Go 是开源的 所以它可能有无限的可能性 所以我真正想要的是一个 通用列表 已知值为 windows linux darwin or fr
  • 将函数参数类型提取为参数包

    这是一个后续问题 解包 元组以调用匹配的函数指针 https stackoverflow com questions 7858817 unpacking a tuple to call a matching function pointer
  • 避免指定包含模板化函数指针的冗余模板参数

    假设我们有这样的代码 template
  • Go 指针 - 通过指针将值附加到切片

    我有一个 struct ProductData 及其实例 p 它有一个切片属性 type ProductInfo struct TopAttributes map string interface 我想设置 TopAttributes 如下
  • Golang:如何在HTTP客户端的TLS配置中指定证书

    我有一个证书文件 该位置是 usr abc my crt我想将该证书用于我的 tls 配置 以便我的 http 客户端在与其他服务器通信时使用该证书 我当前的代码如下 mTLSConfig tls Config CipherSuites u
  • 使用生成的 Golang DLL 返回字符串或 *C.Char

    我一直在努力追随z505 goDLL https github com z505 goDLL回购并遇到了一个大问题 该方法无法返回字符串 我无法读取结果的输出变量 这是我到目前为止使用的代码 Go 完整代码https play golang
  • 仅导出嵌入结构实现的方法子集

    是否可以仅导出嵌入结构实现的方法的子集 这是一种与减少代码复制和粘贴非常不同的方法吗 还有更惯用的方法吗 type A struct func a A Hello fmt Println Hello func a A World fmt P

随机推荐

  • 语言是如何以及为何形成的/是否有任何正在发展的语言表现出希望? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • WinForms TreeView - 如何手动“突出显示”节点(就像被单击一样)

    我需要知道如何让以编程方式选择的节点以图形方式处于 选定 状态 就像用户单击它一样 SelectedNode 仅使这一节点在内部被选中 非常感谢 它没有显示为突出显示的原因是由于树视图没有焦点 这是我的测试表单上的按钮单击事件 TreeVi
  • 如何管理循环器和线程(线程不再消亡!)

    我创建了一个扩展 Thread 的类 以通过非 ui 线程中的 LocationManager 检索用户位置 我将其实现为一个线程 因为它必须根据请求启动并仅在有限的时间内完成其工作 顺便说一句 我必须在线程中添加一个 Looper 对象
  • 通过 hive 访问 maxmind 的 GeoIP-country.mmdb 数据库时出现异常

    我有一个自定义 Hive UDF 来访问 MaxmindGeoIP 国家 mmdb通过 add file pqr mmdb 添加到 Hive 资源的数据库 编译好的 UDF 添加为 add jar abc jar 当我运行 hive 查询时
  • CSS 定位在 div 内

    我使用的 div 内部有 2 个元素 我想将第一个元素垂直对齐到 div 的顶部 将第二个元素垂直对齐 div 是页面的右侧部分 等于主要内容的高度 right float right width 19 background FF3300
  • 解决多个 jQuery 文件之间的冲突

    我的项目中有多个 jquery 文件 我正在使用jquery1 4 2使用facebox 但我也需要原型和scriptacolous脚本 我用过 jQuery noconflict 在我的代码中 但它不起作用 这是网址http mlep c
  • 检查 IE8 是否使用纯 Javascript [重复]

    这个问题在这里已经有答案了 我以前是这样检查的 browser msie browser version 8 但似乎 browser已从 jQuery 的更高版本中删除 So 我怎样才能用纯javascript检查这一点 I tried i
  • 使用 bcrypt-ruby 使用版本 $2y 验证哈希密码

    我们陷入了困境 需要使用 Ruby 根据现有的用户数据库对用户进行身份验证 用户的密码都是使用password compat PHP库生成的 所有散列密码均以 2y 开头 我一直在使用 bcrypt ruby 尝试对用户进行身份验证 但没有
  • 如何将多索引数据帧与单个索引数据帧连接?

    df1 的单个索引与 df2 的多索引的子级别匹配 两者都有相同的列 我想将 df1 的所有行和列复制到 df2 它类似于这个线程 将单索引 DataFrame 复制到多索引 DataFrame https stackoverflow co
  • 从 foreach 循环赋值

    我想并行化一个循环 例如 td lt data frame cbind c rep 1 4 2 rep 1 5 rep 1 10 2 names td lt c val id res lt rep NA NROW td for i in l
  • ActiveAdmin 使用 Devise Rails 登录两次

    我有一个Rails已设置使用的应用程序devise with User模型 我只是添加ActiveAdmin并且它使用单独的型号名称AdminUser 这个新模型也使用了设计 我遇到的问题是 当我去localhost 3000 admin
  • 在 d3v4 堆积条形图中使用 JSON

    我找到了一个d3v3堆积条形图示例 http bl ocks org mstanaland 6100713我想使用它 因为它使用 json 数据 还有一个d3v4规范条形图示例 https bl ocks org mbostock 3886
  • Laravel 5 模型 $cats 到数组 utf-8 JSON_UNESCAPED_UNICODE

    当您有一个数组字段并将其保存在数据库中时 它会对数组进行漂亮的 json encode 但没有 JSON UNESCAPED UNICODE 选项 数据最终如下所示 en u039d u03ad u03b1 这几乎没什么用 解决方案当然是使
  • 如何处理 Primefaces 延迟加载中的错误?

    我无法让用户知道发生的异常PrimeFaces http primefaces org LazyDataModel load方法 我正在从数据库加载数据 当引发异常时 我不知道如何通知用户 我尝试添加FacesMessage to Face
  • Google云平台项目限制

    我可以在 Google Cloud Platform 帐户上创建的项目有限制吗 我将为同一客户托管多个应用程序 我的想法是每个应用程序一个项目 这是一个好主意吗 或者最好将所有应用程序拆分为前端和后端两个项目 您可以创建的项目数量有配额 2
  • VBA Office2010 Shapes.PasteSpecial 失败

    我在将 VBA 代码从 Office2003 迁移到 Office2010 时遇到问题 我想将单元格 Excel 的文本复制到Powerpoint Office2003生成了一个新的文本框 文本样式与Excel中相同 现在我的代码在 Off
  • 更改 jQuery 中链接的标题

    我有一个 id 为 helpTopicAnchorId 的链接 我想在 jQuery 中更改其文本 我该怎么做呢 helpTopicAnchorId text newText P S the jQuery 文档 http docs jque
  • 'val' 或 'var',可变还是不可变?

    我可以定义一个变量 通过var 是不可变的 var x scala collection immutable Set aaaaaa bbbbbb println x isInstanceOf scala collection immutab
  • 如何在外部程序集中的类型的构造函数注入中使用 Ninject

    我正在从外部程序集加载类型并希望创建该类型的实例 但是 此类型 类是由当前管理 绑定的对象设置为构造函数注入的Ninject 我该如何使用Ninject创建此类型的实例并注入任何构造函数依赖项 下面是我如何获得这种类型 Assembly m
  • 在 Go 中执行字节数组

    我正在尝试在 Go 程序中执行 shellcode 类似于使用其他语言执行此操作的方式 示例 1 C 程序中的 Shellcode https stackoverflow com questions 16626857 shellcode i