Control Flow Graph Analysis
Understand and interpret Control Flow Graphs (CFGs) to visualize program execution paths and logic.
Control Flow Graph Analysis is a free Reverse Engineering & Binary Analysis Basics lesson on CoddyKit — lesson 3 of 4. You can read the complete lesson below for free — then practise it hands-on in the browser with a built-in code editor and a 24/7 AI tutor. It is part of the Reverse Engineering & Binary Analysis Basics learning path, one of 4 lessons in the course, and your progress syncs across the web and the CoddyKit app.
Intro to Control Flow Graphs
Welcome! In this lesson, we'll dive into Control Flow Graphs (CFGs). A CFG is like a roadmap for your program, visually showing all possible execution paths.
It's a crucial tool in reverse engineering because it helps you understand a program's logic without actually running it.
The Building Blocks: Basic Blocks
At the heart of a CFG are basic blocks. Think of a basic block as a straight line of instructions.
- It's a sequence of code with only one entry point (the first instruction).
- It has only one exit point (the last instruction).
- There are no jumps or jump targets anywhere in between.
For example, A = 10; B = A + 5; C = B * 2; could be a single basic block.
Edges Show the Way
Edges in a CFG connect basic blocks, showing how execution can flow from one block to another. These represent jumps, calls, or fall-throughs.
- Unconditional Edges: Always taken, like a direct jump to the next block.
- Conditional Edges: Taken only if a certain condition is met, leading to different paths (e.g., an
IFstatement).
A Simple Program's Flow
Let's look at a very simple C program. Its CFG would mostly consist of sequential basic blocks, one after another.
Try running this example:
#include <stdio.h>
int main() {
int x = 5;
int y = 10;
int sum = x + y;
printf("Sum: %d\n", sum);
return 0;
}Conditional Logic (If/Else)
Conditional statements like if/else create branches in a CFG. A basic block containing a conditional jump will have two outgoing edges.
One edge represents the 'true' path, and the other represents the 'false' path. These paths usually merge back together later.
#include <stdio.h>
int main() {
int age = 20;
if (age >= 18) {
printf("Adult\n");
} else {
printf("Minor\n");
}
return 0;
}Loop Structures (For/While)
Loops, such as for or while, are easily identifiable in a CFG by a special type of edge called a back-edge.
A back-edge points from a block inside the loop back to an earlier block, creating a cycle. This cycle represents the repeated execution of the loop body.
#include <stdio.h>
int main() {
for (int i = 0; i < 3; i++) {
printf("Iteration %d\n", i);
}
return 0;
}Function Calls in CFGs
When your program calls a function, the CFG represents this too. An edge will typically lead from the caller's basic block to the entry point of the called function's own CFG.
Once the function finishes, execution returns to the caller, usually to the next instruction after the call.
#include <stdio.h>
void greet() {
printf("Hello from greet!\n");
}
int main() {
printf("Calling greet...\n");
greet();
printf("Greet returned.\n");
return 0;
}The Power of CFGs in RE
CFGs are incredibly powerful for reverse engineering:
- Understand Logic: Quickly grasp complex decision-making and overall program flow.
- Identify Functions: See distinct subgraphs representing different functions.
- Find Vulnerabilities: Spot unusual paths, unreachable code, or logic flaws.
- Trace Execution: Predict potential execution paths without needing to run the program.
Navigating CFGs in Disassemblers
Industry-standard tools like Ghidra and IDA Pro automatically generate and display CFGs for you. They allow you to:
- Visually inspect basic blocks and their connecting edges.
- Click on blocks to view the assembly instructions they contain.
- Follow edges to trace the program's execution flow logically.
This visual aid simplifies understanding complex binaries significantly.
CFG Quick Check
Consider a simple program that includes both an if/else statement and a for loop. Think about how these structures are represented in a Control Flow Graph.
Recap: Your CFG Toolbox
Great job! You've learned the fundamentals of Control Flow Graphs:
- CFGs are visual maps of program execution paths.
- They consist of basic blocks (sequential instruction groups) and edges (showing flow).
- CFGs clearly show conditional logic (
if/else) and loops (with back-edges). - These graphs are indispensable for understanding program logic during reverse engineering, especially when using tools like Ghidra or IDA Pro.
Frequently asked questions
Is the “Control Flow Graph Analysis” lesson free?
Yes — the full text of “Control Flow Graph Analysis” is free to read here on the web, and the Reverse Engineering & Binary Analysis Basics course includes 4 lessons in total. To practise it interactively (a built-in code editor and a 24/7 AI tutor) and unlock the rest of the Reverse Engineering & Binary Analysis Basics course, upgrade to CoddyKit PRO.
What will I learn in “Control Flow Graph Analysis”?
Understand and interpret Control Flow Graphs (CFGs) to visualize program execution paths and logic. You practise Reverse Engineering & Binary Analysis Basics with hands-on code you run directly in the browser, and a 24/7 AI tutor answers your questions as you work through the lesson.
Do I need any experience to start Reverse Engineering & Binary Analysis Basics?
No prior experience is required. Reverse Engineering & Binary Analysis Basics on CoddyKit is structured for beginners through advanced learners; this is — lesson 3 of 4, so you can start here or from the beginning and move at your own pace.
How long does the “Control Flow Graph Analysis” lesson take?
Most CoddyKit lessons take about 5–10 minutes. Each one is bite-sized and interactive, so you make steady progress and pick up exactly where you left off across the web and the app.
Can I write and run code in this Reverse Engineering & Binary Analysis Basics lesson?
Yes. Every Reverse Engineering & Binary Analysis Basics lesson includes a built-in code editor, so you write and run real code right in your browser and get instant AI feedback — no local setup required.
All lessons in this course
- Introduction to Disassemblers
- Identifying Functions and Data
- Control Flow Graph Analysis
- String & Cross-Reference Analysis