64 lines
1.7 KiB
Go
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()
|
|
}
|