Pokémon Shellcode Loader

circle-check
circle-info

A tweet came in from @Checkymander about creating a shellcode loader from Pokémon names. Awesome fun project to mess with blue team, but there wasn't a POC! (or at least when I last checked)

Let's Load Some Instructions

There are multiple ways to do this, here is a decent way:

If we look at a shellcode, it's a series of hex from 0x00-0xFF, or in decimal form of 0-256. There happens to be way more than 256 Pokemon that we can choose from.

From looking at the Pokemon chart above, we can translate BULBASAUR, who is #001 to 0x01 (dropping the first zero). Likewise, CHARMANDER will be represented by 0x04 and so on. Lucky null byte 0x00 can be aligned to Pokemon #257, BLAZIKEN!

Converting shellcode too Pokemon-Shellcode is simple, how about converted Pokmeon-Shellcode to Assembly?! Do we want to have an Array within the .ASM? C code? Pull it down externally?

Many directions to go down!

To Array or not to Array

We need data first, I found two areas that contain both the number of the Pokemon and their name:

https://gist.github.com/armgilles/194bcff35001e7eb53a2a8b441e8b2c6arrow-up-right

and another one, that only have the name of the Pokemon. This might be more useful because we can get the array index position for a particular pokemon without carrying over a long string.

https://github.com/sindresorhus/pokemon/blob/main/data/en.jsonarrow-up-right

What's the baseline?

Taking a regular POP CALC shellcode and throwing some C's at it.

Virustotal output.

Not bad, it's not doing anything malicious, but still... not bad.

Shellcode -> Pokemon_Shellcode

Pretty simple script that converts a shellcode byte Object into the Pokémon Shellcode.

Taking the shellcode above:

Converts to:

['Missingno', 'Venomoth', 'Sunflora', 'Slowbro', 'Cubone', 'Parasect', 'Parasect']

Fun Fact: I wanted to keep the Pokemon name aligned with their number (BULBASAUR = #1, or 0x01), thus needed to fill 0x00/null byte with something. What's better fitting than MISSINGNO?!

Now, Officially called Null, or 0x00.

Another issue, is that the Pokemon Farfetch'd has an apostrophe as shown below. The easy fix is just to remove it and call it: Farfetchd

Finally, there are also two Pokémon that share the same name once you remove the symbols, the fix for those two was to append an F (for female), and for the other append an M (for male).

Nidoran♀ == NidoranF
Nidoran♂ == NidoranM

C++ Function

Conclusion

That, that's the conclusion.

Same code but with using pokemon yield a way better result than I thought it would.

Last updated