Anti-Debug JS/WASM by Hand

Aug 22, 2021

11 mins read

Last week a friend of mine asked me to debug/RE some phishing emails that had been sent to them. These phishing emails were visually very clever and looked identical to the real site! But as I looked at the javascript I frankly became embarassed for the developer. Sure, they’d run the code through an obfuscation engine and added some basic anti-debug tricks, but that’s nothing you can’t defeat with AST and proxying function calls.

Frankly this type of laziness in making javascript confusing to debug was absolutely pathetic. If you know javascript, you know how cursed it can be. This made me decide to see how low I could set the bar for understanding.

If you don’t understand some of the concepts in this blog despite me trying to explain it as best I can: Good. That means I’m doing something right.

So here we go: Let’s write the most cursed abomination to even grace a web browser.

  • If you think you’re clever and don’t want to skip to the end, you can try your hand at tracing the “alert()” function call here: antidebug.html

If you’re interested in more projects like this, give me a follow on Twitter @_mattata. I’m always working on something fun.

Plan of action

We’re going to take a javascript payload:

alert('Trace this function call :)');

…and make it near impossible to figure out where it came from.

How?

  1. I’m going to write WebAssembly by hand (mainly because it seemed fun to learn, but also small size)
  2. The WebAssembly bytecode will have HTML embedded in it.
  3. The HTML will have Javascript embedded in it.
  4. The HTML can be opened by a browser as HTML.
  5. The browser will interpret the Javascript
  6. The Javascipt will fetch() itself into a buffer
  7. The Javascript will allocate a 64kb section of memory
  8. The Javascript will instantiate itself as a WebAssembly module and share the memory
  9. The WebAssembly will run and orchestrate all Javascript calls entirely through shared memory.

For those of you unaware, this is a PolyGlot. The resulting file is both valid WebAssembly (WASM), HTML, and Javascript. All at the same time.

By making the file WASM first, this significantly hampers the ability for someone debugging it to “patch” the file itself. They can’t just “change the HTML”, the HTML is embedded in WASM bytecode. Changing even a single byte will break the entire program 😈.

Cursed enough for you? But wait, there’s more!

As stated above, once the WASM module is instantiated it fully orchestrates all javascript calls. We don’t want people to just be able to extract the strings from the WASM module do we?

How?

  1. The WASM module will actively thwart debugging attempts in browser.
  2. The WASM module will store the anti-debug methods XOR “encrypted”.
  3. The WASM module will store the payload code XOR “encrypted”.
  4. The anti-debug methods will check if they’ve been patched out of memory.
  5. The anti-debug methods will replace themselves if they’ve been patched out.
  6. The anti-debug methods and payload code are “decrypted” upon execution.

Every one of the above items from both lists serves a specific reason to make debugging harder. Rather than make the start of this blog post longer, each of the following development sections will include an accompanying “Why” section.

Let’s jump in!

Bootstrap

We need to embed HTML/JS in our WASM that can be used to bootstrap itself. So we’re gonna use the following code which exposes 1 page (64kb) of memory, fetches itself as a buffer, instantiates itself as a WASM module, and exposes a single function that can construct anonymous JS functions from shared memory with WASM via casting memory as UTF8 text.

<html>
<script>
    var m = new WebAssembly.Memory({ initial: 1 });
    fetch(location, { mode: 'no-cors' }).then(e => e.arrayBuffer()).then(e => WebAssembly.instantiate(e,
        {
            x: {
                y: function (offset, length) {
                    new Function(new TextDecoder('utf8').decode(new Uint8Array(m.buffer, offset, length)))();
                }
            }, js: { mem: m }
        }));
</script>
<html>

Now we remove all spaces and line breaks in the HTML and we’re going to write WASM in a syntax format called the WebAssembly Text Format (WAT)

We’ll use the flexible syntax for WASM that allows you to create a friendly name for WASM func’s using any UTF8 characters to export the $init func as friendly name of… an entire HTML page. Because why not.

(module
(import "x" "y" (func $eval (param i32 i32)))
(import "js" "mem" (memory 1))
(export  "<html><script>var m = new WebAssembly.Memory({ initial: 1 });fetch(location,{mode:'no-cors'}).then(e=>e.arrayBuffer()).then(e=>WebAssembly.instantiate(e,{x:{y: function(offset, length){new Function(new TextDecoder('utf8').decode(new Uint8Array(m.buffer, offset, length)))();}}, js: {mem: m}}));</script><html>" (func $init))

Cool. So now we’ve stuffed an entire HTML page into our WASM as a one-liner.

Why?

Embedding the HTML/JS as a one-liner embedded in a binary file format makes it so that attempting to change the length or contents of the HTML will break the interpretation of the WASM, preventing anyone debugging it.

html

Memory

We’re going to set some initial values in memory for the WASM. We want:

  1. A “ticker” that when it hit’s 1000 will decrypt and run payload
  2. XOR key
  3. A integer to keep track of whether we’re done decrypting the payload
  4. An integer to tell us the stopping point of the payload
  5. An already XOR encypted version of “debugger; " (See: JavaScript AntiDebugging Tricks)
  6. An already XOR encrypted version of our alert() payload, that has also been run through JSFuck which encodes the javascript to only use the characters “()+[]!”

In the WAT syntax below, the pattern is:

(data (<offset in memory to store value>) "value")

And ;; are comments.

    ;;ticker target for tracking debugging
    ;;Offset 0, length 4
    (data (i32.const 0) "\00\00\00\00")
    ;;XOR Key
    ;;Offset 4, length 4
    (data (i32.const 4) "\75\75\75\75")
    ;;XOR Decryption Position Placeholder
    ;;Offset 8, length 4
    (data (i32.const 8) "\00\00\00\00")
    ;;XOR Decryption Final Position
    ;;Offset 12, length 4
    (data (i32.const 12) "\34\22\00\00")
    ;;Anti Debug
    ;;Offset 16, length 12
    (data (i32.const 16) "\11\10\17\00\12\12\10\07\4E\55\55\55")
    ;;Payload
    ;;Offset 28, length 8728
    ;;Must be length multiple of 4 bytes
    (data (i32.const 28) "\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\2E\5D\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\28\5D\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\5E\2E\54\2E\28\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\54\5E\2E\28\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\5E\5D\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\2E\5E\54\5E\2E\28\28\5C\5C\2E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\2E\28\5E\2E\28\5C\2E\5D\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\28\2E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\5D\5E\2E\28\5C\2E\5D\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\54\5E\2E\28\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\28\28\5D\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5C\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5C\5D\5C\5D\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\2E\5D\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\28\5D\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\2E\28\5E\2E\28\5C\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\28\5D\5C\2E\5E\54\5E\2E\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\28\28\5E\5D\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\2E\5E\54\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\2E\5E\54\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\2E\5E\54\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\2E\5E\54\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\2E\5E\54\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\2E\5E\2E\28\28\5E\5D\2E\54\2E\28\28\5E\2E\28\2E\2E\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\2E\5E\54\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\2E\5E\54\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\2E\54\2E\28\28\5E\2E\28\2E\2E\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\2E\5E\54\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\2E\5E\54\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\2E\5E\54\5E\2E\28\28\5C\2E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\5E\5D\54\5E\2E\28\5E\54\5E\2E\28\5E\2E\5E\54\5E\2E\28\28\5E\2E\5E\54\5E\2E\28\28\5C\5C\2E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\2E\28\5E\2E\28\5C\2E\5D\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\28\2E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\5D\5E\2E\28\5C\2E\5D\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\54\5E\2E\28\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\28\28\5D\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\5E\2E\5E\54\5E\2E\28\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\2E\54\2E\28\28\5E\2E\28\2E\2E\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5D\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5C\2E\5D\2E\28\2E\5D\54\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\2E\54\2E\28\28\5E\2E\28\2E\2E\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\28\5D\5C\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\2E\54\2E\28\28\5E\2E\28\2E\2E\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\28\5D\5D\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\2E\5D\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\28\5D\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\5E\2E\28\28\5C\2E\5D\2E\54\2E\28\28\5E\2E\28\2E\2E\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\2E\54\2E\28\28\5E\2E\28\2E\2E\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\28\5D\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\54\2E\28\5E\5D\54\2E\28\5E\2E\5E\2E\28\28\5C\2E\5D\2E\54\2E\28\28\5E\2E\28\2E\2E\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\2E\54\2E\28\28\5E\2E\28\2E\2E\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\28\5D\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5C\5D\5C\2E\5D\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\28\5D\5D\54\2E\28\5E\2E\5E\2E\28\28\5C\2E\5D\2E\54\2E\28\28\5E\2E\28\2E\2E\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\2E\54\2E\28\28\5E\2E\28\2E\2E\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\28\5D\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5C\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5C\5E\5D\2E\28\5E\2E\28\5C\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\2E\28\2E\2E\28\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\2E\5D\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\54\5E\2E\28\5E\54\5E\2E\28\28\5E\5D\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\2E\28\28\28\5C\2E\5E\54\5E\2E\28\5E\2E\5E\2E\28\28\28\5E\5D\54\54\2E\28\5E\2E\28\5C\2E\5E\54\5E\2E\28\28\28\5D\5C\2E\5E\54\5E\2E\28\5E\2E\54\5E\2E\28\5E\54\5E\2E\28\28\28\5C\5D\5C\5C")

Why?

These are used in later sections as ways to share memory.

XOR Encryption

I want a function I can pass 2 parameters to: The offset of the payload in memory and the length of the payload. This function will decrypt the payload in 4-Byte chunks (i32) using the static XOR key stored at memory offset 4 (0x75, 0x75, 0x75, 0x75).

Also, I want this function to use recursion and call itself rather than use a loop.

;;XOR payload
(func $xorpayload (param i32 i32)
    ;;Store current XOR Decryption Position
    (i32.store
    ;;Store at offset 8, the Decryption Position
    (i32.const 8)
    ;;Store the value of first param (offset of payload)
    (local.get 0)
    )
    ;;Decryption loop
    (block
    ;;XOR 4-Byte (i32) Memory Buffer Chunk
    (i32.store 
        ;;Offset to store resulting value of below function
        (i32.load (i32.const 8))
        (i32.xor 
        ;;This loads the Key
        (i32.load (i32.const 4))
        ;;This loads the position of the XOR Decryption, and uses that to load the next chunk of payload
        (i32.load(i32.load (i32.const 8)))
        )
    )
    ;;Check if we're done decrypting
    ;;Load XOR Decryption Final Position to stack
    (i32.load (i32.const 12))
    ;;Load current decryption position to stack
    (i32.load (i32.const 8))
    ;;Comparison Equal
    i32.eq
    br_if 0 ;; branch out of 0th `block` if top item in stack is true (we're done)

    ;;Increment XOR Decryption Position by 4-Bytes (i32)
    (i32.store 
        (i32.const 8)
        (i32.add 
        (i32.load (i32.const 8)) (i32.const 4)
        )
    )
    ;;Recurse
    (i32.load (i32.const 8))
    (local.get 1)
    call $xorpayload
    )
)

Why?

Using basic XOR “encryption” makes if more difficult to pull any values directly out of the WASM bytecode (static analysis). Using recursion rather than a loop to iterate over the decryption is just a nice FU to anyone trying to debug it.

Init

Now we get into the main program logic. We want to check if our “ticker” value has exceeded 1000, and if so decrypt and run the payload.

(func $init
    ;;Check if equals 1000
    block
        ;;Ticker
        (i32.load (i32.const 0))
        ;;Target
        i32.const 1000
        ;;Comparison Not Equal
        i32.ne
        ;;Exit function if true
        br_if 0 ;; branch out of 0th `block` if top item in stack is true
        ;;Execute code if we've made it this far
        ;;XOR Decrypt, offset, length
        i32.const 28
        i32.const 8728
        call $xorpayload
        ;;Call decrypted payload
        i32.const 28  ;; pass offset 28 to eval
        i32.const 8728  ;; pass length 8728 to eval
        call $eval
    end

Why?

If someone has DevTools open the anti-debug feature will halt execution until they manually resume execution. They would need to do this 1000 times to get to the point that the actual payload is decrypted ffrom memory. If DevTools is not open, calling “debugger;” does nothing, so the payload is run near-instantaneously.

Ticker

We want to increment the “ticker” by 1 each cycle so we know when to run the payload.

;;Store the sum of i32 from offset 0 plus 1 at offset 0
;;Increment ticker by 1
(i32.store 
    (i32.const 0)
    (i32.add 
    (i32.load (i32.const 0)) (i32.const 1)
    )
)

Why?

We don’t want our payload to run instantly, just near-instantly. As WASM has no sense of any timers I’m aware of, I just increment by 1 each cycle.

Anti-Debug

We want to call “debugger;” in the javascript context once each cycle until our ticker reaches 1000. We need to decrypt our debug string and evaluate it.

This pauses execution flow for anyone trying to debug it.

Then we want to check that the decrypted string in memory is still our anti-debug string “debugger”, so I check for the presence of the i32 value 1969382756 which is equivalent to the starting characters “debu”.

If someone has patched the decrypted string in memory, we put them back using i32.const values that represent the same string “debugger; “.

;;Anti Debug
;;Decrypt Debug
i32.const 16
i32.const 12
call $xorpayload
;;Eval Debug
i32.const 16
i32.const 12
call $eval
;;Check if memory has been patched
block
    ;;Check first block
    ;;debu from memory
    (i32.load (i32.const 16))
    ;;debu as const
    (i32.const 1969382756)
    ;;Comparison Equal
    i32.eq
    ;;Exit function if true
    br_if 0 ;; branch out of 0th `block` if top item in stack is true
    ;;Someone tried to patch the shared memory, put it back!
    ;;debu
    (i32.store (i32.const 16) (i32.const 1969382756))
    ;;gger
    (i32.store (i32.const 20) (i32.const 1919248231))
    ;;;   
    (i32.store (i32.const 24) (i32.const 538976315))
end
;;Re-encrypt Debug
i32.const 16
i32.const 12
call $xorpayload

Why?

We only want the anti-debug string available decrypted in memory when we’re running it, then instantly re-encrypt right afterward.

A byproduct of calling the anti-debugger is that it opens the actual DevTools debugger (HA!). This means that someone debugging it can patch the section of memory so that the string is all spaces " “. This would allow them to bypass the anti-debug feature and actually set good breakpoints.

Patching memory is the only way I was able to get past the anti-debugger in my own tests. So now the WASM checks if the string has been changed, and if so writes back i32.const (values directly part of the WASM bytecode that aren’t available through memory) that represent the string “debugger;”. Effectively, this closes the door behind me on the only good method I found in bypassing this.

Halt Recursion

Since we’re not using a loop, we need to use our “ticker” as an indicator that we need to stop our recursion before we hit the maximum call stack.

A simple code block that allows exiting the program if the ticker is greater than 1000 will work just fine.

;;Call stack no loop
block
    ;;Ticker
    (i32.load (i32.const 0))
    ;;Target
    i32.const 1000
    ;;Comparison Unsigned Int Greater Than
    i32.gt_u
    ;;Exit function if true
    br_if 0 ;; branch out of 0th `block` if top item in stack is true
    ;;Recurse if not at the ticker value yet
    call $init
end

Grab Control Flow

THIS IS WHERE THE MAGIC HAPPENS! Normally functions are exported/imported from javascript and WASM to be shared and called.

But there’s a special case in WASM that once instantiated, it can take off running with a default “start” function so long as it does not take any parameters or return any values.

;;Default WASM Instantiation
(start $init)

Why?

This is what gives us the power to make the WASM control the javascript and not the other way around.

Fin

You can try your hand at attempting to trace the “alert()” function call by clicking the following link:

The full annotated WAT source code (and npm scripts + development environment) is available here: https://github.com/xen0bit/handcraftedwasm/blob/main/main.wat

Thanks for reading.

Sharing is caring!