Files
go_pwner/workspace/template/main.go
T
2026-07-18 21:37:15 +03:00

64 lines
1.7 KiB
Go

// Шаблон solve-скрипта для winpwn.
// cp -r ../workspace/template ../workspace/mysolve
// cd ../workspace/mysolve && go run .
package main
import (
"bytes"
"encoding/binary"
"fmt"
"log"
"strconv"
"winpwn"
)
func p64(v uint64) []byte { return winpwn.P64(v) }
func u64(b []byte) uint64 { return binary.LittleEndian.Uint64(b) }
func parseHex(s string) uint64 {
v, _ := strconv.ParseUint(s, 16, 64)
return v
}
func parseAddr(line []byte) (uint64, error) {
idx := bytes.Index(line, []byte("0x"))
if idx == -1 {
return 0, fmt.Errorf("no hex addr in %q", line)
}
return strconv.ParseUint(string(bytes.TrimSpace(line[idx+2:])), 16, 64)
}
func main() {
// --- Вариант А: статический бинарь без ASLR ---
// Открыть PE для анализа (работает для ASLR:No)
pf, err := winpwn.OpenPE("chal.exe")
if err != nil {
log.Fatalf("OpenPE: %v", err)
}
winRVA, _ := pf.GetProcAddress("win")
base, _ := pf.ImageBase()
winAddr := base + winRVA
pf.Close()
fmt.Printf("[+] win() @ 0x%X\n", winAddr)
// Запустить таргет
tube, err := winpwn.Spawn("chal.exe")
if err != nil {
log.Fatalf("Spawn: %v", err)
}
// --- Вариант Б: символы живого процесса (аналог pwintools p.libs/p.symbols) ---
// sym := winpwn.NewProcessSymbols(tube.PID())
// defer sym.Close()
// k32, _ := sym.Base("kernel32.dll")
// winexec, _ := sym.Symbol("kernel32.dll", "WinExec")
// mods, _ := sym.Modules() // все загруженные DLL
_ = winAddr
tube.RecvLine() // баннер готовности
// Твой эксплойт здесь
tube.Interactive()
}