Я пытаюсь выполнить shellcode в программе Go, аналогично тому, как вы можете сделать это с другими языками.Выполнение байтового массива в Go
Пример 1 - Shellcode in C program
Пример 2 - http://www.debasish.in/2012/04/execute-shellcode-using-python.html
Все методы имеют в целом аналогичные методы - назначить шеллкода к исполняемому памяти с помощью конкретного распределения OS (ттар, VirtualAlloc, и т.д.), а затем выполнить код путем создания указателя функции, указывающего на это место перед выполнением.
Вот мой ужасный хакерский пример при выполнении той же вещи в Go. Шестнадцатеричный код имеет манипуляции, выполняемые над ним перед передачей функции, поэтому он является форматом, когда байт [] исправлен. Говоря, что 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.
Если вы пишете в файл вы можете также позвонить syscall.Exec на нем – ReyCharles
@ReyCharles, что означало бы писать правильно отформатированный файл (например, ELF на Linux, PE на Windows, и т.д.). Не уверен, что Windows все еще разрешает запуск файлов в формате MS-DOS в формате COM (которые были простыми). – kostix
Да, извините, я не думал :) – ReyCharles