Assembly

Assembly Notes

High-level vs. Low-level

Architecture

Assembly File Structure

global _start

section .data
    message db "Hello World!"
    length equ $-message

section .text
_start:
    mov rax, 1 ; syscall number 1 means use the sys_write syscall
    mov rdi, 1 ; 1st argument - file descriptor 1 means output to stdout
    mov rsi, message ; 2nd argument - pointer to message string
    mov rdx, length ; 3rd argument - number of bytes to write
    syscall

    mov rax, 60 ; syscall 60 is exit
    mov rdi, 0 ; 1st argument - return exit code 0
    syscall

Assembling a file

Disassembling a file

GDB

Coding in Assembly

Data Movement

Arithmetic

Bitwise Instructions

Loops

Branching

Using the Stack

Subroutines

Functions

Shellcode

Pwntools

from pwn import *; context(os="linux",arch="amd64",log_level="error")
run_shellcode(unhex("{shellcode}")).interactive()

Shellcoding Techniques

Shellcoding Tools

global _start

section .text
_start:
  mov al, 59          ; execve syscall number
  xor rdx, rdx        ; set env to NULL
  push rdx            ; push NULL string terminator
  mov rdi, '/bin//sh' ; first arg to /bin/sh
  push rdi            ; push to stack 
  mov rdi, rsp        ; move pointer to ['/bin//sh']
  push rdx            ; push NULL string terminator
  push rdi            ; push second arg to ['/bin//sh']
  mov rsi, rsp        ; pointer to args
  syscall