Skip to content
Snippets Groups Projects
Verified Commit f96d9239 authored by Tóth Miklós Tibor's avatar Tóth Miklós Tibor :shrug:
Browse files

add wasm challenge

parents
No related branches found
No related tags found
No related merge requests found
output/*
codes.go
.idea
Makefile 0 → 100644
all: wasm_exec build
GOROOT = $(shell go env GOROOT)
wasm_exec:
cp $(GOROOT)/misc/wasm/wasm_exec.js output/
build:
go generate
GOOS=js GOARCH=wasm go build -o output/app.wasm wasm.go codes.go common.go
package main
func substitute(in string, sub map[rune]rune) string {
ret := ""
runeArr := []rune(in)
for _, r := range runeArr {
if s, ok := sub[r]; ok {
ret += string([]rune{s})
} else {
ret += string([]rune{r})
}
}
return ret
}
func cesar(in string, num int32) string {
ret := ""
for _, c := range in {
ret += string([]rune{c + num})
}
return ret
}
package main
import (
"encoding/base64"
"fmt"
"io/ioutil"
"math/rand"
"os"
"time"
)
const passwd = "Webassemble, then d1sassemble"
var flagparts = []string{"SECUR", "ITEAM", "{5d69eb759a5d7", "e9094f3246ff", "4b951c7}"}
func init() {
rand.Seed(time.Now().UnixNano())
}
func makeRandomSub() map[rune]rune {
alphabet := make([]rune, 0)
for r := 'A'; r < 'Z'; r++ {
alphabet = append(alphabet, r)
}
for r := 'a'; r < 'z'; r++ {
alphabet = append(alphabet, r)
}
for r := '1'; r < '9'; r++ {
alphabet = append(alphabet, r)
}
shuffled := make([]rune, len(alphabet))
copy(shuffled, alphabet)
rand.Shuffle(len(shuffled), func(i, j int) {
shuffled[i], shuffled[j] = shuffled[j], shuffled[i]
})
ret := make(map[rune]rune)
for i := 0; i < len(alphabet); i++ {
ret[alphabet[i]] = shuffled[i]
}
return ret
}
func invertSubs(sub map[rune]rune) map[rune]rune {
ret := make(map[rune]rune)
for k, v := range sub {
ret[v] = k
}
return ret
}
func randInt32() int32 {
i := int32(0)
for i == 0 {
i = rand.Int31() % 20
}
return i
}
func main() {
code := "package main\nimport \"encoding/base64\"\n\n"
// Start generating encrypted flag storage
c1 := randInt32()
s1 := makeRandomSub()
c2 := randInt32()
s2 := makeRandomSub()
c3 := randInt32()
s3 := makeRandomSub()
c4 := randInt32()
s4 := makeRandomSub()
code += fmt.Sprintf("var a = %#v\n", cesar(flagparts[0], c1))
code += fmt.Sprintf("var b = %#v\n", substitute(flagparts[1], s1))
code += fmt.Sprintf("var c = %#v\n", cesar(base64.StdEncoding.EncodeToString([]byte(flagparts[2])), c2))
code += fmt.Sprintf("var d = %#v\n", cesar(substitute(flagparts[3], s2), c3))
code += fmt.Sprintf("var e = %#v\n", substitute(cesar(substitute(flagparts[4], s3), c4), s4))
code += fmt.Sprintf(`
var s1 = %#v
var s2 = %#v
var s3 = %#v
var s4 = %#v
func fl() string {
p3, _ := base64.StdEncoding.DecodeString(cesar(c, -%d))
return cesar(a, -%d) + substitute(b, s1) + string(p3) + substitute(cesar(d, -%d), s2) + substitute(cesar(substitute(e, s4), -%d), s3)
}`, invertSubs(s1), invertSubs(s2), invertSubs(s3), invertSubs(s4), c2, c1, c3, c4)
// Done generating encrypted flag storage
// Start generating password checker
c5 := randInt32()
code += fmt.Sprintf(`
var cc = %#v
func ch(in string) bool {
return cesar(in, %d) == cc
}
`, cesar(passwd, c5), c5)
_ = ioutil.WriteFile("./codes.go", []byte(code), os.ModePerm)
}
wasm.go 0 → 100644
package main
//go:generate go run generator.go common.go
import (
"sync"
"syscall/js"
)
func main() {
window := js.Global().Get("window")
window.Set("check", js.FuncOf(CheckKey))
// Make main wait forever
var wg sync.WaitGroup
wg.Add(1)
wg.Wait()
}
func CheckKey(this js.Value, args []js.Value) interface{} {
if len(args) != 1 {
return "error"
}
in := args[0].String()
if ch(in) {
return fl()
}
return "bad password"
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment