ARM_12-bit_Immediates_are_Too_High_Level
Encoding 12 bit immediate values for 32 bit ARM instructions can get somewhat complicated when the numbers get large enough, click this article for more details.
A Blog
Encoding 12 bit immediate values for 32 bit ARM instructions can get somewhat complicated when the numbers get large enough, click this article for more details.
Invoke is a common calling convention for assembly source, especially as found as examples on the internet. But 'invoke' isn't assembly, it's abstracted, and it makes disassembly harder to follow. This post is a discussion of this issue and how I came to using the standard assembly 'call' convention.
RRX is encoded as ROR with the imm5 field hardcoded as 0's.
The MOV and shift instructions (like LSL) are encoded the same. You could use the LSL instruction with the imm5 field hardcoded to 0's and it will encode exactly the same as MOV.
Building a BrainFuck compiler with the main component being the sed tool.
The order of adding two registers in a pointer shouldn't matter logically, but it does when it comes to encoding. This is because the 2nd register is a multiplier even if only be 1. Read more for the interesting details.
An exploration of some ambiguities that signed numbers can introduce to your assembler, what your assembler will choose, and how you can choose anything you want.
A quickstart guide to making some boot sector games. This guide assumes you know some x86 basics. From there, you learn how to boot a skeleton with a stack, video memory, keyboard control, timing loops, colors, and random.
These are the slides (with slide notes) that I gave at Cactus Con in 2016. It's about my unrealized childhood dream of programming in machine code directly (unrealized as a child).
Abuse of the REP prefix for instructions that it doesn't apply to.
Not all registers can be scaled (multiplied by 1, 2, 4, & 8), read on for details of why this is a thing due to machine encoding.
Some insctructions have the operand of immediate 1 hardcoded, but you can still use 1 as an operand value for the variale immediate data.
Some abuse and redundancy discussion involving scaling by 2 and other edge cases with the SIB table.
LEA is encoded with the MODR/M byte, even though that would allow for some invalid encodings. Read on if you want to explore what happens when we do this.
A test instruction that is valid in assembly language, but has no machine encoding. The assembler uses something logically equivalent when encoded.
It is invalid assembly to BSWAP 16-bit registers, read on to find out what happens when we try to do it anyway.
Use simple math instructions to modify other instructions for some fun self modifying code.
There were some questions to my methods for the original post on Vm0wd2Qy, so this is a follow-up to explain everything.
Encoding of the JMP instruction can have reduncancies, here we explore using less common encodings.
Some recursive Base64 magic.
SUB and CMP are already similar enough in x86, but in Propeller, they are even encoded super similar, to where you can do some stupid assembly syntax to convert one into the other.
This is by far my favorite x86 encoding thing; you can unlock way more functionality with this instruction that requires machine encoding beyond just basic assembly.
Pretty much any insctruction can be a NOP, due to a 'never' condition. ARM is very similar in this way.
Using the FIST instruction as an obfuscation technique, because fisting.
Taking a look at some blank spots in the Intel manuals opcode map.
Intel tries to abuse the ModR/M table for variable byte NOPs, read on to see how we can do some better abuse for multibyte NOPs that are also still sledable.
Some instructions have a register (a common one like EAX) hardcoded, but you can still use the non hardcoded encoding and still pick EAX. This offers a redundancy.
SAL is valid assembly, but gets encoded as SHL, yet we can still hardcode the real SAL, and it works as it should!
A tutorial/walkthrough on some of my methods of writing code in machine code instead of assembly language.
A breif description of the brain I put into my bass guitar.
An abuse of prefixes to get every instruction on a program to be encoded with the same amount of bytes.
An announcment that the 8ball tool now supports regular expression denial of service.
An obfuscation technique that spotlights the ADD instruction.
Partly a troll, but also I couldn't thing of a better way to solve a problem then to use a GOTO at the time I coded this.
A lab that I was never assigned. This tought me the lesson of how much you can do when not given the bias that it is supposed to be hard. In this case, tedious.
An announcment of my slidedeck software.
Shows that there are many other encodings to the several FENSE instructions.
MoDR/M and SIB tables can get pretty heavy with redundancies, read on to dive into it.
The plus character isn't actually handled as 1 or more, the upper limmit is usually capped at somepoint. Read on to see how one implementation caps the upper limit.
There are different syntactical choises for quantifiers when using regex, but you only really need one of them.
A cheat sheet for common regex syntax.
This art was supposed to go into a HOPE and DEF CON talk, but didn't make it into the deck. Read on to hear more about it.
The most boring of x86 redundancies; redundant mnemonics.
This was one of the first x86 oddities that I chased, it wasn't super interesting, but it's what got me started going down this deep dark path.
First blog post in original WordPress blog format