
the concept of bit(binary digit) using lamps. what do we mean by data and what is binary language?
a general overview of what a computer is. a computer in general form is said to be maid up of three sections:
cpu, memory, input/output devices
Explore binary numbering system, convert between binary, decimal, and hexadecimal representations, and learn how grouping bits into four yields hexadecimal representations.
Explore how a transistor uses gate, drain, and source terminals, with a threshold around 2.7 volts, to switch current on and off, forming the building blocks of computers.
Analyze how a five-volt voltage source with a one-second cycle, controlling the gate, drives a transistor to blink a lamp in a simulated circuit observed on an oscilloscope.
Design a nand gate with four transistors (two pmos and two nmos), explain input-driven output, and present the nand gate as a universal building block for ram and cpu.
demonstrates building a memory byte by wiring eight circuits together to store eight bits. shows eight boxes forming ram-like memory with addressable memory cells for selective access.
Create an eight-byte ram by arranging eight memory cells and a three-to-eight decoder to address them; write to a selected cell by applying address and data patterns.
Explore how multiplexers create a controllable data path by selecting register outputs to a shared bus, using two-to-one multiplexers and chip enable signals to avoid wire conflicts.
Explore eight-bit two's complement encoding from minus 128 to 127, enabling subtraction by adding negatives; flip bits and add one to get negative values, using the msb as sign.
Explore subtracting using two's complement by inverting the value, adding one, and feeding through an adder to produce the negative result, illustrated with 35 minus 19 equals 16.
An enabler circuit demonstrates and gate behavior, showing how the output becomes one only when both inputs are one and how a control bit can enable or disable the signal.
Build a two-operation alu that adds or subtracts using a control bit to select between pass-through input and its negation, implemented with xor and not gates.
Put together the computer by wiring RAM, registers, the AC, ALU, and a multiplexer to feed the input and address lines, then clear all registers to zero.
Execute instructions on old computers by moving from high-level ideas to assembly, illustrating memory addresses, registers, random access memory, and binary translation via the assembler, with loops, comparisons, and increments.
Explain how a computer executes instructions through a fetch-decode-execute cycle, using the program counter and instruction register, and contrast Harvard architecture versus von Neumann architectures with separate data and instructions.
Create a custom file type and a program that treats data as an image by mapping bits to 16x27 pixels, using a header for image metadata and 24-bit RGB colors.
Explain the ELF header structure in C, including the common header, program header, and loader and linker roles, and how 2-byte and 8-byte fields are defined through type aliases.
Analyze a binary file’s sections and segments to map data layout and understand where machine instructions reside; use objdump to disassemble and prepare for an assembly language crash course.
Removing the exit system call causes the program to fetch and execute memory bytes, leading to unpredictable behavior and, after printing a word, a segmentation fault.
Explore how jz and je use the eflags register to drive conditional jumps, based on zero and parity flags, as numbers compare and print results.
Explore implementing a loop that compares A and B, uses subtract and logic operations, and uses carry-based jumps jc and jb to control flow and printing.
Learn how assembly packages instructions into a function, call it from an entry point, and return to the next instruction.
Learn to implement functions in assembly on linux x64 by using jumps, saving the instruction pointer, and applying relative addressing to control execution flow.
Implement a Python password checking loop that prompts for input up to three attempts, compares it to the predefined password MGE12345, prints success, and maps assembly concepts to Python.
Learn how arrays and pointers are implemented in x64 assembly, define a data array, access elements via base plus offset, and inspect results with gdb.
Create and run your C program on Linux by writing a main file, including headers and libraries, and compiling with gcc through preprocessing, compiling, assembling, and linking to an executable.
Learn how to declare and initialize integers and characters in c, print their decimal and character representations, and view values as ascii using gcc to compile.
Explore a c program that adds two numbers and prints 30, while using gdb to inspect the stack changes and intel disassembly.
Step through the last program with gdb, inspect registers and the stack, and observe how pushes and memory addresses modify the top of the stack and the bytes allocated.
Explore how arrays in C represent a collection of integers, how the array name points to the first element, and how size and address concepts reveal memory layout.
Apply a for loop to iterate over a five-element array, printing each element with its index and decimal value. Explanations cover array length, size of elements, and zero-based indexing.
Analyze the stack layout of the last program using GDP on OpenNet, with stripped symbols, and map RSP, RBP, and 0x18/0x20 offsets to the stack frame.
Learn how to set up the stack in Linux x64 using gdb to inspect memory, zero bytes, and align four- and eight-byte writes for correct layout.
Explore how arrays are created in the stack on linux x64 by tracing memory addresses, hex values, and mov operations to illustrate stack layout and data placement.
Learn how to create and modify strings using pointers in linux x64, including element-level changes, pointer targets, and printing addresses and contents of null-terminated strings.
Compare strings created with arrays and pointers in memory by building and modifying a stack-based array, then inspecting pointer targets and their addresses using disassembly.
Develop a custom string length function inside a library for Linux x64 reverse engineering and exploit development. Test by passing a string and printing its length in decimal.
Implement a printf-like function in C that writes to standard output using a descriptor, a string pointer, and its length; compute length with a custom strlen and print the string.
complete the program and process layouts in linux x64 reverse engineering, examining elf headers, symbol tables, version sections, and linking concepts, including dynamic linking and the main text section.
Explore reversing malware to spawn a shell by mapping memory addresses, disassembling code, and crafting a payload that places binsh on the stack for execution.
Examine how the accept system call yields a new circuit by returning a file descriptor for an incoming connection on a listening socket, with pending connections queued.
Analyze malware behavior by reversing execve calls and testing argv and environment handling, using Wireshark to monitor traffic during execution.
Learn exploit development and reverse engineering on linux x64, exploring offensive security through two paths: reverse engineering to bypass authentication, and input-driven exploitation to reveal credentials from databases.
Explore how linux x64 programs use argc and argv to pass arguments, inspect memory and the stack with GDB, and understand argv as an array of pointers to strings.
Explore how linux x64 passes function arguments, using registers when possible, and pushes the return address on the stack for function calls and stack-frame management.
Explore how a program's flow of execution can be influenced by manipulating function calls, return addresses, and stack arguments, using memory, disassembly, and step-by-step analysis.
Explore how to change a Linux x64 program's behavior by manipulating return addresses and function arguments, using disassembly and registers like rdi to alter strings and output.
i always wanted a course, a book or something which starts from scratch and brings me to an expert level. i saw and read a lot of courses which teach you the applications and software about security and hacking, learning those in security industry, is like knowing wordpress to design websites without understanding programming languages. so i started this course from scratch, from nothing. because as einstein put it: "if you can't explain something simply then you don't understand it well enough". in security the difference between experts and amateurs is just in the same statement. those who know the background science are those who DESIGN the metasploit and other softwares, and those who don't are the users of the programs. which one do you want to be?
if the answer is the first group, this the right place for you. we really start from nothing, introduce you the concept of data, that what do we mean by data, bits and bytes? we then introduce the basic element of all the digital devices: TRANSISTOR.
then we use that transistor to create the logic gates, nand and not gates. but we only create them if we need them, so before creating anything, we ask the question of "why do i need this?" . then we start to give a general overview of what a computer is, why we need it and how we are going to create it. that brings us to the concepts that as human we can't remember everything, so we needed something which could remember as long as we want it to, and more importantly we want it to do the computation so much faster that we ever could. those are the only two things that computer has over human brain. so based on that we proceed, a memory for remembering and a cpu for processing. so we start my using our nand gates to create both memory and cpu. and we test it, troubleshoot it, add features to it, until we have our computer. now we save our program as a set of instructions inside the memory, the cpu would fetch those instructions, and execute them and move to the next one, and it does it over and over again. everything in the computer which is not hardware, is a program, a simple FILE.
so in the second chapter we start talking about files. if all the computer could know are 1s and 0s, how could it show us text and images, movies and executables. this is were we talk about file extensions and headers. so that it could be an introduction into getting us to the elf file format, the executables and binary files in linux. because if we want to reverse files and crack and hack them, first we need to know them. all its segment and section headers, but not just an overview, going deep , somehow that we comprehend every byte of it. now its time for us to know how they get executed, or how they get created? using programming languages: ASSEMBLY
in the next chapter we enter the assembly world. why we need it , like always would be the main question, if we could anser it then we enter to HOW we do it. we teach everything you need to know about assembly. and when we write a program we debug it using the gdb, analyze instructions one by one, so that you know the reason for each instruction. and at the same time we compare assembly with other higher level programming languages.
why we need c programming language would trigger the creation of the next chapter. variables, pointers, format specifers, functions, they are all just names without a concept and their comprehension, thats why for every single abstraction there is a separate lecture depicting the memory and stack(we explain what this is in an intuitive manner) organization and how it changes.
when we know all these sciences in such a different manner, then when we get to the reverse engineering and exploit development, the last two chapter, you see that these are just a different look of everything we have learned so far. just looking differently and keep track of memory. and using these we would be able to reverse engineer malwares, hack and crack softwares. which means acquiring the offensive skills without which , you could never be a real hacker.