Pwn - Cheatsheet

PWN Nov 8, 2023

Document qui regroupe toutes les commandes utiles pour du pwn.

How to overwrite EIP

En 32 bits:
$gdb-peda> pattern create 100
Regarder le registre EIP dans la sortie et copier les symboles présents dedans.
$gdb-peda> pattern offset AACB
$gdb-peda> 80
On controle EIP au bout du 80ème caractères.

En 64 bits: Les adresses ne fonctionnent pas de la même manières. Les variables ne sont plus stockés dans la stack mais dans les registres. Pour overwrite EIP, il faut d'abord overwrite RBP. Quand RBP est réécrit on ajoute +8 et on controlera EIP.

Readelf

Trouver les sections accessibles en RW avec readelf:
$> readelf --sections <binary>
Trouver si les sections sont vides:
$> readelf -x <sections> <binary>
Trouver les symbols d'un binaire:
$> readelf -s <binary> | grep <function>

Objdump

Trouver les fonctions disponibles avec la @PLT
$> objdump <binary> -d | grep ".*@plt"*

Rabin2

Trouver le nom des fonctions
$> rabin2 -i <binary>
Trouver les strings dans un binaire
$> rabin2 -z <binary>

ROPGadget

$> ROPgadget --binary <file> --only "intruction|ret"

Ret2libc

Une ret2libc est utile lorsque la stack d'un programme est non-exécutable (NX). Le but est d'aller chercher des fonctions utiles comme system() dans la libc pour pouvoir exécuter ce qu'on veut.

/!\ Pour que ça marche le programme doit être Dynamically Linked et non Static /!\

Pour trouver system() dans un binaire nous pouvons:

  • $gdb> find system
  • $gdb> p system
  • $gdb> info func system
    Pour trouver /bin/sh, il faut que la chaine de caractères soit déjà mapper en mémoire:
  • find __libc_start_main,+99999999,"/bin/sh" (mode bourrin)
  • Aller voir la section .data et/ou .rodata
  • Ecrire en mémoire /bin/sh.

En 32bits: Le format du payload sera junk bytes + adresse de system() + adresse d'exit + adresse de /bin/sh

En 64bits: Le format du payload sera junk bytes + pop rdi + adresse de /bin/sh + adresse de system()

Pour s'entrainer: Challenge Split sur ROP EMPORIUM

Tags