小编Pel*_*eus的帖子

在Go中执行字节数组

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

例1 - C程序中的Shellcode

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

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

这是我在Go中执行相同操作的可怕hacky示例.shellcode在传递给函数之前对它执行了操作,所以它的格式为[]字节是固定的.说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)
}
Run Code Online (Sandbox Code Playgroud)

在代码的最后,我有一个指针(切片?)代码,我认为是可执行内存 - 但我不知道如何将此地址转换为函数指针执行.我询问了一些IRC频道,但有人认为这可能是不可能的.

任何帮助是极大的赞赏.

干杯.

function-pointers go shellcode

5
推荐指数
2
解决办法
1376
查看次数

使用go动态创建编译的二进制文件

首先对不起可能是一个糟糕的标题 - 我想我遇到的很多困难与不知道我正在努力实现的目标的正确术语有关.

在Go中,我希望有一个程序,在运行时可以动态创建二级二进制文件.用一个基本的hello world例子说明 - 伪代码,因为我不知道如何实现它.

generator.go
-> Read in statement from statement.txt (i.e. "Hello World")
-> Insert this statement into the following program...

package main

import (
    "fmt"
)

func main(){
    fmt.Println([dynamic statement inserted here])
}

-> compile this code into subprogram
Run Code Online (Sandbox Code Playgroud)

无论何时go run generator.go执行,subprogram都会创建二进制文件.运行它会输出Hello World.将statement.txt更改为其他内容并go run generator.go再次执行将再次创建subprogram在运行时将执行新语句.

综上所述

使用Go,我如何创建一个可以动态创建已编译的子程序作为输出的程序.

谢谢.

compilation dynamic go dynamically-generated

4
推荐指数
1
解决办法
263
查看次数

两个列表,如果找到共同匹配,则打印另一个列表元素

我有两个文本文件,格式。

File 1  
Column A    Column B      

File 2  
Column B    Column C  
Run Code Online (Sandbox Code Playgroud)

在文件 2 中,B 列只是文件 1 中数据的一个子集。

我希望搜索文件 1,如果在文件 2 中找到与 B 列数据点匹配的内容,则打印 A 列值。

谁能建议如何以简单的方式做到这一点?最好是 Python 或 Bash。

非常感谢。

一个例子

File 1  
Bruce Dog  
Frank Cat  
Adam Fish  
Alex Horse  

File 2  
Dog Blue  
Fish Green  
Run Code Online (Sandbox Code Playgroud)

会打印:

Bruce  
Adam
Run Code Online (Sandbox Code Playgroud)

python bash compare match

1
推荐指数
1
解决办法
1088
查看次数

Python Generator 内存对大量读取的好处?

我想知道 python 生成器在这个用例中的内存优势(如果有的话)。我希望读入一个必须在所有对象之间共享的大文本文件。因为它只需要使用一次,一旦列表用完,程序就会结束,所以我打算使用生成器。

我相信生成器的“保存状态”可以让它跟踪下一个要传递给调用它的对象的值是什么。我读过生成器还可以通过不立即返回所有值而是即时计算它们来节省内存使用量。如果我在这个用例中得到任何好处,我有点困惑。

示例代码:

def bufferedFetch():
    while True:
        buffer = open("bigfile.txt","r").read().split('\n')
        for i in buffer:    
            yield i
Run Code Online (Sandbox Code Playgroud)

考虑到缓冲区无论如何都会读取整个“bigfile.txt”,这不会存储在生成器中,没有内存好处吗?有没有更好的方法来返回可以在所有对象之间共享的列表的下一个值?

谢谢。

python generator

1
推荐指数
1
解决办法
528
查看次数

如何在处理结果时正确关闭 Goroutines 中的共享通道

我试图找到使用工作程序生成的结果的正确方法,同时在所有工作完成后优雅地退出结果循环。为了说明,我做了下面的例子。我的实际情况与此示例略有不同,因为我不知道每个工作程序 go 例程将返回多少“工作”,显然这些 for 循环正在执行固定数量的结果 (5)。

我是 goroutines 和 channel 的新手,但以下是我理解的基本租户;

  • 只有发件人应该关闭频道
  • range在通道上执行将继续直到通道关闭
package main

import (
    "fmt"
    "sync"
)

func worker1(r chan string, wg *sync.WaitGroup) {
    for i := 0; i < 5; i++ {
        r <- fmt.Sprintf("1.%d", i)
    }

    wg.Done()
}

func worker2(r chan string, wg *sync.WaitGroup) {
    for i := 0; i < 5; i++ {
        r <- fmt.Sprintf("2.%d", i)
    }

    wg.Done()
}

func main() {
    var wg sync.WaitGroup

    r := make(chan string)
    wg.Add(2)
    go worker1(r, …
Run Code Online (Sandbox Code Playgroud)

go channels

1
推荐指数
1
解决办法
97
查看次数