// Шаблон 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() }