This document presents algorithms for finding gadgets that can be chained together to perform arbitrary operations without code injection. The algorithms work by first identifying "free branch" instructions in the target binary that allow controlling program flow. It then analyzes paths leading to these instructions to extract gadgets. Gadgets are represented as expression trees to enable platform-independent comparison. The trees capture the operation performed by each gadget. The goal is to find a minimal set of gadgets that are sufficient for Turing-completeness yet convenient to program with.