๐Ÿ’€Assembly

Assembly language is a low-level programming language that is used to directly control a computer's hardware. It is a symbolic representation of the machine code instructions that a computer's processor can execute. Assembly language is specific to a certain computer architecture and is often used for system programming, such as operating system development, device drivers, and embedded systems.

Hello World!

BITS 32
section .data
    hello db 'Hello, World!',0

section .text
    global _start

_start:
    ; write hello to stdout
    mov edx, 13       ; message length
    mov ecx, hello    ; message to write
    mov ebx, 1        ; file descriptor (stdout)
    mov eax, 4        ; system call number (sys_write)
    int 0x80          ; call kernel

    ; exit
    mov eax, 1        ; system call number (sys_exit)
    xor ebx, ebx      ; return value (0)
    int 0x80          ; call kernel

To compile the script you will need nasm and ld package. Here's an example bellow to "compile" a assembly script. In reality we not say "compile" bur link.

nasm -f elf64 -o script.o script.asm ; ld -o script script.o

+4

This script get an input from a user and add 4 to it.

BITS 32
section .data
   userMsg db 'Please enter a number: '
   lenUserMsg equ $-userMsg
   dispMsg db 'The number +4 : '
   lenDispMsg equ $-dispMsg

section .bss
   num resb 5

section .text
   global _start

_start:
   mov eax, 4
   mov ebx, 1
   mov ecx, userMsg
   mov edx, lenUserMsg
   int 80h

   ;Read and store the user input
   mov eax, 3
   mov ebx, 2
   mov ecx, num
   mov edx, 5
   int 80h

   ;Output the message 'The entered number is: '
   mov eax, 4
   mov ebx, 1
   mov ecx, dispMsg
   mov edx, lenDispMsg
   int 80h

   ;+4 for num
   add dword [num], 4

   ;Output the number entered
   mov eax, 4
   mov ebx, 1
   mov ecx, num
   mov edx, 5
   int 80h

   ; Exit code
   mov eax, 1
   mov ebx, 0
   int 80has

Alphabet

Our mission is to make an assembly script with the expected output.

Here's the script.

BITS 64

global _start

section .text
        _start:
                mov r14, 0x41
                mov r13, 0xA
                mov r15, 0x5A+1

        _forloop:
                mov rax, 1
                mov rdi, 1
                push r14
                mov rsi, rsp
                mov rdx, 0x1
                syscall

                mov rax, 1
                mov rdi, 1
                push r13
                mov rsi, rsp
                mov rdx, 1
                syscall

                inc r14
                cmp r14, r15
                je _quit
                jmp _forloop

        _quit:
                mov rax, 60
                mov rdi, 0
                syscall

Reverse Engineering

What's Reverse Engineering ?

Reverse engineering is the process of analyzing a software program to understand how it works and to identify any vulnerabilities that could be exploited. Assembly language can be used as a tool for reverse engineering because it is a low-level programming language that provides a direct representation of the machine code instructions that a computer's processor can execute.

When reverse engineering a program, a pentester may use a disassembler to convert the program's machine code into assembly language. This allows them to see the program's instructions and understand how it works. By analyzing the assembly code, a pentester can identify any potential vulnerabilities in the program, such as buffer overflows, that could be exploited to gain unauthorized access to a system.

Additionally, assembly language can be used to patch a program to fix vulnerabilities or to add new features. This is called reverse engineering of code. It's a powerful technique to analyze how a software works and can be used as a way to modify, enhance or fix it.

It's important to note that reverse engineering could be illegal and illegal in some countries, so it's important to have legal authorization before doing it.

Requirements

First, we need to install gef . If you want to see the repo...

Installation

Here's how to install it.

# via the install script
## using curl
$ bash -c "$(curl -fsSL https://gef.blah.cat/sh)"

## using wget
$ bash -c "$(wget https://gef.blah.cat/sh -O -)"

# or manually
$ wget -O ~/.gdbinit-gef.py -q https://gef.blah.cat/py
$ echo source ~/.gdbinit-gef.py >> ~/.gdbinit

# or alternatively from inside gdb directly
$ gdb -q
(gdb) pi import urllib.request as u, tempfile as t; g=t.NamedTemporaryFile(suffix='-gef.py'); open(g.name, 'wb+').write(u.urlopen('https://tinyurl.com/gef-main').read()); gdb.execute('source %s' % g.name)

Let's start!

To start gdb just use the command gdb with the binary file.

gdb ./binary.bin

Let's tell the program that we want to disassembly the binary.

disas _start

Now we have to specify an address to tell the program where to start RE.

b * _start +0
run

Let's find what's that meen.

Last updated