Affichage des articles dont le libellé est tools. Afficher tous les articles
Affichage des articles dont le libellé est tools. Afficher tous les articles

dimanche 13 mars 2011

[Tool] ROPit v0.1 alpha 1

[UPDATE: 14/03/2011]:
- Mise en place d'un GIT
- Ajout d'explications pour l'installation

Salut les gens!

Mon dernier article commence déjà à remonter :).

Introduction

Aujourd'hui j'ai le plaisir de vous présenter un tool de ma conception.
Il est encore extremement buggué, pas pour rien que je considère ça comme une alpha ^^.
C'est un tool de ropping tout ce qu'il y a de plus classique.

So let's ROPit!

Ce tool va juste construire une liste de gadgets à partir d'un exécutable PE ou d'un fichier raw (assemblé directement avec nasm par exemple).

Il génère un peu plus de gadgets que pvefindaddr, à voir si c'est utile.

La génération des gadgets se déroule en plusieurs étapes:
- recherches de toutes les instructions "utiles" avec un algorithme itératif de backtracking de 32 instructions en arrière maximum
- construction des gadgets avec les instructions trouvées
Les gadgets sont limités à 8 instructions volontairement.

J'ai codé ce tool pour la simple raison que je trouvais les tools disponibles assez lents vu que codés en python (ROPme, pvefindaddr et DEPlib). Et puis c'est assez marrant à coder :).

Par ailleurs, si quelqu'un a une bibliothèque de SAT/SMT solver, ça pourrait être utile ;).

Installation

Pour compiler et installer le tool vous aurez besoin des dépendances suivantes:
sudo apt-get install libdisasm-dev libpcre3-dev libtool

A partir du repository GIT:
La première fois:
git clone https://github.com/m101/ropit
cd ropit
git submodule init
git submodule update --recursive
make

Les fois suivantes:
cd ropit
git pull
git submodule update --recursive
make

Bugs connus

FIXED (GIT): Le tool ne génère aucuns gadgets pour un exécutable trop gros. En effet, la gestion mémoire n'est pas encore au top, je voulais séparer la logique de l'affichage mais ça semble assez compromis.


Testé uniquement sur architecture 64 bits pour l'instant, je testerais sur 32 bits une fois les fonctions de bases implémentées correctement.

Le tool crash lorsqu'on essaie de chercher des gadgets dans un fichier ELF 32 bits sur une architecture 64 bits (fonctionne parfaitement sous architecture 32 bits).

La version 0.1 alpha 2 sortira un peu plus tard, le temps que j'implémente les différents formats de fichiers visés et que je teste sous 32 bits :).

Si jamais vous trouvez un crash ou un bug d'une quelconque nature, vous pouvez toujours contribuer en soumettant des rapports de crashs comme décrit ici: Debugging Program Crash.

Conclusion

Bon ok cool on a des tools de ropping ... mais vous les trouvez pas trop limités? :)
Si vous voulez contribuer, vous savez où me joindre :).

Cheers,

m_101

- link: ROPit v0.1 alpha 1
- repos GIT: https://github.com/m101/ropit

samedi 20 novembre 2010

Tips and tools for Linux and Windows

Dans toutes les étapes du dévelopement d'un sploit ou encore de la résolution d'un challenge (dans l'applicatif comme toujours :)) on se rend compte que notre meilleur amis après Google est notre débuggueur adoré (avant tous les autres tools de reversing :)).
Je vais ici décrire mon environnement de travail (qui est sommaire pour l'instant vu que je commence à peine à jouer avec les reals worlds exploits ...).

C'est une liste de tools qui est loin d'être exhaustive, mais je vais vous présenter ce que j'utilise.

Sous Linux

Pas de miracle ou de mystère, le débugueur roi est ici GDB!
C'est pas une panacé à utiliser mais avec l'habitude on s'y fait et c'est mine de rien une bien puissante bête :).
J'ai toujours trouvé un peu lourd à devoir retaper les habituels 'i r', etc après chaque break mais coup de chance, on peut tuner GDB! Un bon script existe : Plugin GDB :)
Oui de zoli couleur ^^.


Et pis bon, le débuguer fait pas tout, parfois on a besoin de choper des addresses de fonctions rapidos : nm.

On oublie pas de mater les bibliothèque loadées avec : ldd.

objdump est assez pratique pour dumper des listings asm entiers (et faire une recherche d'instructions intéressantes ;)).

nasm est indispensable pour l'assembly ... sans compter ndisasm.

Ou si on veut analyser les shellcodes utilisés dans les sploits, voilà 3 scripts shells de ma conception qui pourraient vous être utiles.
Le premier sert à cleaner les outputs de ndisasm :
#!/bin/sh

sed -r -e '
1 i bits 32\
\
section .text\
    global _start\
\
_start:

s/([0-9A-F]+\s+){2}/    /g
'
Le second à passer en unicode les payload unicode en ASCII :
#!/bin/sh

if [ "$#" -lt 1 ]
then
    echo "Usage : $0 (ascii2unicode|unicode2ascii)"
fi

case "$1" in
    ascii2unicode)
        sed -r 's/(\w)/\1\x00/g'
    ;;
    unicode2ascii)
        sed -r 's/(\w)\x00/\1/g'
    ;;
esac
Le dernier sert juste à me sortir n'importe quel fichier en hex escaped.
#!/usr/bin/python

import sys
import struct

if len(sys.argv) < 2:
    filename = '-'
else:
    filename = sys.argv[1]

if filename == '-':
    data = sys.stdin.read()
else:
    fp = open(filename, 'r')
    data = fp.read()
    fp.close()

# let's form the shellcode in C form
escaped = ''.join ("\\x%02x" % ord(c) for c in data)
shellcode = 'char shellcode[] = "' + escaped + '"'

print "shellcode size : %i" % len(data)
print shellcode
Ainsi en utilisant la ligne de commande on est mine de rien assez versatile :
m_101@m_101-laptop $ printf "CC" | ./ascii2unicode.sh ascii2unicode | ndisasm -b 32 - | ./clean_nasm.sed 
bits 32

section .text
    global _start

_start:
    inc ebx
    add [ebx+0x0],al
m_101@m_101-laptop $ printf "JUNK" | ./shellcode2arrayopt.py -
shellcode size : 4
char shellcode[] = "\x4a\x55\x4e\x4b"

On peut instrumenter GDB avec Python : PythonGDB.
Au pire il suffit de créer un fichier de commande GDB et de le lancer comme ça :
gdb -ex 'source cmds.gdb'

C'est la méthode que j'utilise pour dumper par exemple :
#!/usr/bin/python

# Author  : m_101
# email   : m101.sec at gmail.com
# Target  : Linux
# Depends : gdb, python
# Name    : iDumpMem
# Purpose : Dumping memory portion out of some process
# Version : 0.1
# License : GPL
# Greetz to people for which hacking is a way to live
# Thanks to 2600 Montreal folks for bringing this script idea
# The code is a bit crappy but it works at least :)

from os.path import *
from os import *
from sys import *
from commands import *
from string import *

# arguments check
if len(argv) < 3:
    # example: iDumpMem python heap
    print 'Usage: ' + argv[0] + 'proc_name memory_section [dump_file]'
    exit(1)

proc_name = argv[1]
mem_section = argv[2]

if len(argv) == 4:
    dump_file = argv[3]
else:
    dump_file = 'dump_' + proc_name + '_' + mem_section

# process information
proc_ps_line = getoutput('ps aux | grep ' + proc_name + ' | grep -Ev
"(grep|' + argv[0] + ')"')
if proc_ps_line == '':
    print 'Process ' + proc_name + " doesn't exist"
    exit(1)

# process id
proc_id = split(proc_ps_line)[1]
if proc_id == '':
    print "Didn't found proc_id ... exiting"
    exit(1)

# getting the memory section of interest
proc_maps_mem = getoutput('cat /proc/' + proc_id + '/maps | grep ' +
mem_section)
if proc_maps_mem == '':
    print 'No ' + mem_section + ' found ... exiting'
    exit(1)

# memory addresses
mem_range = split(proc_maps_mem)[0]

mem_start = '0x' + split(mem_range, '-')[0]
mem_end = '0x' + split(mem_range, '-')[1]

# printing the informations gained
print 'Process name : ' + proc_name
print 'Process id   : ' + proc_id
print 'Process ' + mem_section + ' : ' + mem_range
print '[+] Dumping process ' + mem_section + ' memory ... '

cmds_file_existed = exists(getcwd() + '/cmds.gdb')

# we create gdb commands file if the file doesn't exist yet
# we delete it afterward
if cmds_file_existed == False:
    gdb_cmds_file = file('cmds.gdb', 'w')
    gdb_cmds_file.write('attach ' + proc_id + '\n')
    gdb_cmds_file.write('dump mem ' + dump_file + ' ' + mem_start + '
' + mem_end + '\n')
    gdb_cmds_file.write('detach\n')
    gdb_cmds_file.write('quit\n')
    gdb_cmds_file.close()

# we execute gdb cmds for dumping targeted memory
gdb_dump_mem = getoutput("gdb -ex 'source cmds.gdb'")

# we delete the created gdb cmds file
if cmds_file_existed == False:
    unlink('cmds.gdb')

print '[+] ' + proc_name + ' ' + mem_section + ' was dumped'
print '[+] Bye bye ;)'

Sous Windows?

C'est pas les tools qui manquent!

Jouer avec les PEs

On pensent à identifier un éventuel packer avec PEiD ou RDG Packer Detector.


On peut ensuite faire du diffing avec DarunGrim.
En terme de patching engine, le meilleur que j'ai trouvé est diablo2oo2's Universal Patcher .

On peut aussi dumper ses process' avec LordPE:

Pour reconstruire ses dump, ImpREC est toujours aussi utile.


Les debuggers : 


Immunity debug

OllyDBG


WinDBG
IDA PRO


En termes de plugins :
Byakugan (windbg) : utile pour le sploit dév'.
pvefindaddr (ImmunityDBG) : utile pour le sploit dév'.
patchdiff2 : sert a choper les modifications des updates par exemple

D'autres tools peuvent être utiles :
PAIMEI : Reverse engineering framework
ROPEME : ROP Exploit Made Easy

Et pour finir l'un des tools qui est très utile : VirtualBox.

Et vous, quels tools utilisez-vous?

m_101

Tuning GDB Plugin GDB
Diff tools