Code source
Code disas
@N0fix
TAILLE DES INSTRUCTIONS | |
---|---|
ARM - THUMB | 2 |
ARM | 4 |
INTEL
mov dx,0x05eb
0x66
0xba
0xeb
0x05
jmp $+5
BAD INST
- Linear sweep
- Flow oriented
char buffer[BUF_SIZE];
int position = 0;
while (position < BUF_SIZE) {
x86_insn_t insn;
int size = x86_disasm(buf, BUF_SIZE, 0, position, & insn);
if (size != 0) {
char disassembly_line[1024];
x86_format_insn( & insn, disassembly_line, 1024, intel_syntax);
printf("%s\n", disassembly_line);
position += size;
} else {
/* invalid/unrecognized instruction */
position++;
}
}
x86_cleanup();
main:
push chaine
jmp $+9
db "IDA > r2",0x7b
add dword [esp], 6
call puts
ret
08049170 <main>:
8049170: 68 1c c0 04 08 push 0x804c01c
8049175: eb 07 jmp 804917e <main+0xe>
8049177: 49 dec ecx
8049178: 44 inc esp
8049179: 41 inc ecx
804917a: 20 3e and BYTE PTR [esi],bh
804917c: 20 72 32 and BYTE PTR [edx+0x32],dh
---> 7b 83 jnp 8049104 <register_tm_clones+0x14>
8049181: 04 24 add al,0x24
8049183: 06 push es
8049184: e8 a7 fe ff ff call 8049030 <puts@plt>
8049189: c3 ret
0x7b -> premier octet de certaines instructions jmp
Source
Désassemblé
Function Call Instructions | call getABeer |
---|---|
Return Instructions | ret (no shit) |
Sequential Flow Instuctions | pop, push, mov, etc |
---|---|
Conditional Branching Instructions | je, jne, jnz, etc |
Unconditional Branching Instructions | jmp goBoussole, jmp eax |
goBoussole:
<some unkown code yet>
__start:
push ebp,
mov esp, ebp
# ajout à la table de références, on disas la suite
jmp goBoussole
leave
ret
goBoussole |
Table des références
Désassemblé
1. Lit une instruction
2. Si instruction de branchement, met l'adresse de la condition vraie sur une pile pour la désassembler plus tard
Table des références
goBoussole:
mov eax, 1
mov ebx, 0
int 0x80
__start:
push ebp,
mov esp, ebp
# ajout à la table de références, on disas la suite
jmp goBoussole
leave
ret
Désassemblé
1. Lit une instruction
2. Si instruction de branchement, met l'adresse de la condition vraie sur une pile pour la désassembler plus tard
eleve |
Table des références
SECTION .data
str_theou db "Ça me parait pas deconnant", 0
str_eleve db "Est ce que ça parait deconnant?", 0
SECTION .text
GLOBAL main
eleve:
<unkn>
theou_be_like:
<unkn>
exit:
<unkn>
main:
xor eax, eax
jz eleve
call exit
Désassemblé
1. Lit une instruction
2. Si instruction de branchement conditonnel, désassemble le FAUX par défaut
3. Push l'adresse de la condition VRAI
exit |
---|
eleve |
Table des références
SECTION .data
str_theou db "Ça me parait pas deconnant", 0
str_eleve db "Est ce que ça parait deconnant?", 0
SECTION .text
GLOBAL main
eleve:
<unkn>
theou_be_like:
<unkn>
exit:
<unkn>
main:
xor eax, eax
jz eleve
call exit
Désassemblé
1. Lit une instruction
2. Si instruction de branchement conditonnel, désassemble le FAUX par défaut
3. Push l'adresse de la condition VRAI
eleve |
Table des références
SECTION .data
str_theou db "Ça me parait pas deconnant", 0
str_eleve db "Est ce que ça parait deconnant?", 0
SECTION .text
GLOBAL main
eleve:
<unkn>
theou_be_like:
<unkn>
exit:
mov eax, 1 ; sys_exit
int 0x80
main:
xor eax, eax
jz eleve
call exit
Désassemblé
1. Lit une instruction
2. Si instruction de branchement conditonnel, désassemble le FAUX par défaut
3. Push l'adresse de la condition VRAI
Table des références
SECTION .data
str_theou db "Ça me parait pas deconnant", 0
str_eleve db "Est ce que ça parait deconnant?", 0
SECTION .text
GLOBAL main
eleve:
push str_eleve
call puts
jmp theou_be_like
theou_be_like:
push str_theou
call puts
call exit
exit:
mov eax, 1 ; sys_exit
int 0x80
main:
xor eax, eax
jz eleve
call exit
Désassemblé
SECTION .text
GLOBAL main
main:
push chaine
xor eax, eax
jz beer+1
beer:
db 0xe8 # One byte
pop eax # <beer+1>
ret
Disassembly flow oriented :
1. Lit une instruction
2. Si instruction conditionnelle, fait un choix
3. Désassemble la condition fausse par défaut
4. Met l'adresse de la condition vraie sur une pile pour la désassembler plus tard
Source
68 18 C0 04 08 push offset chaine ; "thegame"
31 C0 xor eax, eax
74 01 jz short near ptr beer+1
beer: ; CODE XREF: main+7↑j
E8 58 C3 66 90 call near ptr 986B54C6h
66 90 xchg ax, ax
main endp ; sp-analysis failed
1. Lit une instruction
2. Si instruction conditionnelle, fait un choix
3. Désassemble la condition fausse par défaut
4. Met l'adresse de la condition vraie sur une pile pour la désassembler plus tard
SECTION .text
GLOBAL main
main:
push chaine
xor eax, eax
jz beer+1
beer:
db 0xe8 # One byte
pop eax # <beer+1>
ret
Source
Désassemblé
gdb-peda$ ni
Inconvénient : Facilement corrigeable sous IDA
74 03 jz short near ptr loc_4011C4+1
75 01 jnz short near ptr loc_4011C4+1
loc_4011C4:
E8 58 C3 90 90 call near ptr 90D0D521h
Désassemblé
SECTION .text
GLOBAL main
main:
push chaine
xor eax, eax
jz beer+1
jnz beer+1
beer:
db 0xe8
pop eax ; beer+1
ret
Source
74 03 jz short near ptr loc_4011C5
75 01 jnz short near ptr loc_4011C5
; ----------------------------------
E8 db 0E8h
; ----------------------------------
loc_4011C5: ; CODE XREF: sub_4011C0
; sub_4011C0+2j
58 pop eax
C3 retn
Désassemblé + modifié
Inconvénient : Facilement corrigeable sous IDA
main:
mov ax, 0x05eb
xor eax, eax
jz $-4
db 0xe8
push chaine
call puts
ret
Source
1. Lit 0xEB et 0xFF pour former JMP-1
2. Met l'adresse à -1 sur la pile de références
3. Lit 0xC0 et essaye d'en faire une instruction
(fcn) main 10
int main (int argc, char **argv, char **envp);
0x08049170 mov dx, 0x5eb ; 1515
0x08049172 jmp fcn.08049179
0x08049174 xor eax, eax
0x08049176 je 0x8049172 ; main+0x2
0x08049178 call 0xcc4ade5
|- fcn.08049179 108
fcn.08049179 (int32_t arg_28h);
; arg int32_t arg_28h @ esp+0x28
0x08049179 push loc.chaine ; 0x804c01c ;
0x0804917e call sym.imp.puts ; int puts(const char *s)
0x08049183 mov eax, 1
0x08049188 int 0x80
R2/CUTTER
beer:
call $+5 ; 1
add dword [esp], 13 ; 2
ret
db "IDA > r2"
push ebp
mov ebp, esp
push dword [ebp+8]
call puts
leave
ret
main:
push chaine
call beer
mov eax, 1
int 0x80
Source
1
2
Push <beer+5> sur la stack
Ajoute 13 à l'adresse pushé sur la stack
add dword [esp],13 | 4 octets |
---|---|
ret | 1 octet |
IDA > r2 | 8 octets |
< vrai début de fonction
Inconvénient : Nopable facilement
SECTION .data
chaine db "Hello world !", 0
SECTION .text
GLOBAL main
push chaine
call puts
mov eax,1
int 0x80
main:
mov eax,0xd6a951ae
xor eax, 0xdeadc0de
call eax
ret
Source
Inconvénient : la balle de techniques pour trouver ce genre de call
https://slides.com/nofix/reverse-engineering/