dostat zdroják Petr Zemek Fakulta informačních technologií VUT v Brně izemek

Podobné dokumenty
Operační systémy. Cvičení 4: Programování v C pod Unixem

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

IUJCE 07/08 Přednáška č. 1

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

Operační systémy. Cvičení 3: Programování v C pod Unixem

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LEXIKÁLNÍ ANALÝZA

Algoritmizace a programování

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Algoritmizace a programování

Embedded vývoj v Clutteru a Mx

x86 assembler and inline assembler in GCC

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Dílčí příklady použití jazykových konstrukcí v projektu. Jazyk C Příklady. Pravidla překladu v gmake. Zadání

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

- jak udělat konstantu long int: L long velka = 78L;

Knihovny pro CUDA J. Sloup a I. Šimeček

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Úvod do jazyka C. Úvod do jazyka C. Knihy 2/2. Knihy 1/2. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze.

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE STRUKTURA PŘEKLADAČE

Algoritmizace a programování

Základy programování (IZP)

Základy programování (IZP)

Programovanie v jazyku C - ti to zratam...

Strukturu lze funkci předat: (pole[i])+j. switch(výraz) velikost ukazatele

Preprocesor a koncepce (větších) programů. Úvod do programování 2 Tomáš Kühr

Zdroje Úvod Zápis a kompilace programu Příklad programu v jazyce C Příklad programu s výstupem. Úvod do jazyka C. Jan Faigl

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

Programovací jazyk C++ Hodina 1

Základy programování (IZP)

Programovací jazyk C(++) C++ area->vm_mm->locked_vm -= len >> PAGE_SHIFT;

Semestrální práce z předmětu. Jan Bařtipán / A03043 bartipan@studentes.zcu.cz

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Algoritmy I. Cvičení č. 2, 3 ALGI 2018/19

PROGRAMOVÁNÍ V C++ CVIČENÍ

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

FAKULTA INFORMAČNÍCH TECHNOLOGIÍ

Práce s knihovnami. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Vstupní a vstupní proudy v C++

Algoritmizace a programování

Semestrální práce KIV/PC Řešení kolizí frekvencí sítě vysílačů Zdeněk Bečvář A14B0466P 10. ledna 2016

Základy programování (IZP)

Základy programování (IZP)

DETEKCE PODOBNOSTI ZDROJOVÝCH SOUBORŮ V JAZYCE C C LANGUAGE SOURCE FILES SIMILARITY DETECTION

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

4. Rekurze. BI-EP1 Efektivní programování Martin Kačer

- program = vykonatelný soubor - proces = jedna instance vykonávaného programu

Základy programování v C

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

Ukazatele, paměťové třídy, volání funkcí

Konstruktory překladačů

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

Matematika v programovacích

Základní datové typy, proměnné - deklarujeme předem - C je case sensitive rozlišuje malá a velká písmena v názvech proměnných a funkcí

PB071 Programování v jazyce C

11. Přehled prog. jazyků

Funkční objekty v C++.

Část 2 Příklad načítání grafu, kompilace a projekt s více soubory. Část 3 Zadání 9. domácího úkolu (HW09)

Architektura COM. Historie Component Object Model (COM) Komunikace s komponentami Rozhraní komponent COM komponenty v.net.

Rozsáhlé programy = projekty

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

Jazyk C Program v jazyku C má následující strukturu: konstanty nebo proměnné musí Jednoduché datové typy: Strukturované datové typy Výrazy operátory

Jazyk C. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 8 A0B36PR2 Programování 2

Stromy. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 10 B0B36PRP Procedurální programování

Pokročilé architektury počítačů

Část 1 Jazyk C - syntax, proměnné, typy a řídicí struktury

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

Struktury a dynamické proměnné

18. února 2015, Brno Připravil: David Procházka. Programovací jazyk C++

Algoritmizace a programování

C2110 Operační systém UNIX a základy programování

Opakování programování

Programování v C++ 1, 1. cvičení

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Modelování a simulace - spojité modelování

Rozklad problému na podproblémy, rekurze

Základy programování (IZP)

Např.: // v hlavičkovém souboru nebo na začátku // programu (pod include): typedef struct { char jmeno[20]; char prijmeni[20]; int rok_nar; } CLOVEK;

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Programování MCU ve vyšších programovacích jazycích

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE REALIZACE PŘEKLADAČE I

Část I. Část 1 Jazyk C - syntax, proměnné, typy a řídicí struktury. Část 1 Jazyk C - syntax, proměnné, typy a řídicí struktury.

Řídící struktury, if, while, switch

Kompilace Makele C++ Zadání úlohy. Kompilace a Makele. OSD. O. Fi²er. April 18, O. Fi²er Kompilace, Makele

Základy programování (IZP)

- program = vykonatelný soubor - proces = jedna instance vykonávaného programu

Programování v jazyce C pro chemiky (C2160) 10. Grafická knihovna g2

Stromy. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 10 B0B36PRP Procedurální programování

DTP Základy programování Úvod do předmětu

Základní datové struktury

Struktury, funkce, reference

AUTHOR : Robert Follner DATE. Abstrakt ABSTRACT: Několik poznatků autora (Robert Follner) z programování

6. lekce Úvod do jazyka C knihovny datové typy, definice proměnných základní struktura programu a jeho editace Miroslav Jílek

Základy programování v C

Funkce, intuitivní chápání složitosti

Transkript:

Zpětný překlad aneb jak z binárky dostat zdroják Petr Zemek Fakulta informačních technologií VUT v Brně Božetěchova 2, 612 66 Brno, ČR http://www.fit.vutbr.cz/ izemek Brněnské Pyvo, 24.4.2014

Něco málo o přednášejícím Petr Zemek Ph.D. student @ VUT FIT (od 2010) - teorie formálních jazyků vývojař v AVG Technologies a člen projektu Lissom @ VUT FIT (od 2011) - vývoj a výzkum v oblasti zpětného překladu http://petrzemek.net Petr Zemek Zpětný překlad aneb jak z binárky dostat zdroják 2 / 7

Něco málo o přednášejícím Petr Zemek Ph.D. student @ VUT FIT (od 2010) - teorie formálních jazyků vývojař v AVG Technologies a člen projektu Lissom @ VUT FIT (od 2011) - vývoj a výzkum v oblasti zpětného překladu http://petrzemek.net Od hamburgeru ke krávě aneb jak z binárky získat zdroják http://talks.petrzemek.net/barcamp2013/ Petr Zemek Zpětný překlad aneb jak z binárky dostat zdroják 2 / 7

Co je to ten zpětný překlad? Překlad (kompilace) Zpětný překlad (dekompilace) Petr Zemek Zpětný překlad aneb jak z binárky dostat zdroják 3 / 7

K čemu je to dobré? Petr Zemek Zpětný překlad aneb jak z binárky dostat zdroják 4 / 7

Zpětný překladač projektu Lissom vyvíjený od roku 2011 Lissom @ VUT FIT ve spolupráci s AVG Technologies cíl: generický zpětný překlad binárního kódu vstup: - platformně závislý binární program - architektury: x86 (i386), ARM, ARM-Thumb, MIPS, PIC32, PowerPC - souborové formáty: ELF, PE - především programy napsané v C, ale i assembleru, C++, Delphi - popis platformy (CPU, ABI, knihovny,... ) výstup: uniformní výstup v jazyku vyšší úrovně (C, Python ) disassemblovaný kód grafické reprezentace (graf toku řízení, grafy volání) statistiky Petr Zemek Zpětný překlad aneb jak z binárky dostat zdroják 5 / 7

Koncept vyvíjeného zpětného překladače Petr Zemek Zpětný překlad aneb jak z binárky dostat zdroják 6 / 7

Koncept vyvíjeného zpětného překladače Petr Zemek Zpětný překlad aneb jak z binárky dostat zdroják 6 / 7

Koncept vyvíjeného zpětného překladače Petr Zemek Zpětný překlad aneb jak z binárky dostat zdroják 6 / 7

Koncept vyvíjeného zpětného překladače Petr Zemek Zpětný překlad aneb jak z binárky dostat zdroják 6 / 7

Koncept vyvíjeného zpětného překladače Petr Zemek Zpětný překlad aneb jak z binárky dostat zdroják 6 / 7

Koncept vyvíjeného zpětného překladače Petr Zemek Zpětný překlad aneb jak z binárky dostat zdroják 6 / 7

Koncept vyvíjeného zpětného překladače Petr Zemek Zpětný překlad aneb jak z binárky dostat zdroják 6 / 7

Koncept vyvíjeného zpětného překladače Petr Zemek Zpětný překlad aneb jak z binárky dostat zdroják 6 / 7

Prohlídka online dekompilační služby http://decompiler.fit.vutbr.cz/ Petr Zemek Zpětný překlad aneb jak z binárky dostat zdroják 7 / 7

That s All Folks!

Ukázka 1 (ARM, ELF, GCC, -O2, stripped) Původní kód: #include <stdio.h> #include <stdlib.h> int my_sum(int i) { int b = rand(); int c = rand(); int d = b - c; return (b + c) * (i + d); } Dekompilovaný kód: #include <stdint.h> #include <stdio.h> #include <stdlib.h> int32_t function_8218(int32_t a) { int32_t x = rand(); int32_t y = rand(); return (x + a - y) * (x + y); } int main(int argc, char **argv) { int a = rand(); int b = rand() + 2; int c = 0; if (a > b) { printf("true"); c = my_sum(a); } else { printf("false"); c = my_sum(b); } return a - b - c; } int main(int argc, char **argv) { int32_t apple = rand(); int32_t banana = rand() + 2; if (apple > banana) { printf("true"); return apple - banana - function_8218(apple); } printf("false"); return apple - banana - function_8218(banana); }

Ukázka 2 (x86, PE, GCC, -O0, -g) Původní kód: 1 int factorial(int n) { 2 if (n == 0) 3 return 1; 4 return n * factorial(n - 1); 5 } 6 7 int calculate(int a, int b) { 8 return a * factorial(b); 9 } 10 11 int main(int argc, char **argv) { 12 //... 13 //... 14 //... 15 //... 16 //... 17 } Dekompilovaný kód: // From module: test.c // Address range: 0x401560-0x401585 // Line range: 1-5 int32_t factorial(int32_t n) { int32_t result; if (n!= 0) { result = factorial(n - 1) * n; } else { result = 1; } return result; } // From module: test.c // Address range: 0x401587-0x40159c // Line range: 7-9 int32_t calculate(int32_t a, int32_t b) { return factorial(b) * a; } // From module: test.c // Address range: 0x40159e - 0x401606 // Line range: 11-17 int main(int argc, char **argv) { //... }

Ukázka 3 (graf toku řízení) entry: 0x16a0bb0: a = apple 0x169dd80: switch a: default: case 0: case 1: (a!= 0) and (a!= 1) a == 0 a == 1 0x169e5d0: printf("%d", a) break 0x169f0a0: printf(" 0 ") break 0x169fa60: printf(" 1 ") break 0x16a0480: printf("after") exit:

Ukázka 4 (graf volání) main test [U] mystrlen mytoupper rand [D] utilize [U] printf [D]

Ukázka 5 (graf volání + ladicí informace) main.c main examples.c mystring.c test [U] mytoupper mystrlen utilize [U] rand [D] printf [D]