Skip to content

Instantly share code, notes, and snippets.

@mgarciaisaia
Last active April 7, 2020 22:37
Show Gist options
  • Save mgarciaisaia/3bd1f0d30320d80405f2512cd01c6211 to your computer and use it in GitHub Desktop.
Save mgarciaisaia/3bd1f0d30320d80405f2512cd01c6211 to your computer and use it in GitHub Desktop.
¿Por qué la decompilación no reconstruye el código fuente con precisión?

¿Por qué la decompilación no reconstruye el código fuente con precisión?

El principal problema es que la compilación no es una función biyectiva. Muchos programas fuente pueden generar el mismo programa objeto, y también con el mismo código fuente puedo generar distintos códigos objeto, según el nivel de optimización.

En este ejemplo, tenemos una manera muy poco eficiente de asignar el valor 1000 a una variable.

Si compilo con el parámetro -g de gcc, lo que le pido al compilador es que no aplique ninguna optimización, y respete el código que yo escribí.

Por el contrario, con el parámetro -O3 le pido que aplique todas las optimizaciones posibles.

Con objdump -d puedo imprimir las distintas secciones de un programa compilado, y ver sus instrucciones de assembler.

Si miramos las definiciones de <main> en estos dos casos, vemos clarísimo la diferencia: la versión no-optimizada cumple estrictamente con el bucle (jle es la instrucción clave - cambia el instruction pointer si un valor dado es menor a otro), mientras que la versión optimizada simplemente devuelve un valor hardcodeado.

$ gcc -g -o bucle bucle.c # compilar con simbolos de debug, sin optimizaciones, a `bucle`
$ gcc -O3 -o bucle-optimo bucle.c # compilar con optimizacion agresiva a `bucle-optimo`
$ objdump -d bucle > bucle.objdump
$ objdump -d bucle-optimo > bucle-optimo.objdump
bucle-optimo: file format elf32-i386
Disassembly of section .init:
0804828c <_init>:
804828c: 53 push %ebx
804828d: 83 ec 08 sub $0x8,%esp
8048290: e8 7b 00 00 00 call 8048310 <__x86.get_pc_thunk.bx>
8048295: 81 c3 6b 1d 00 00 add $0x1d6b,%ebx
804829b: 8b 83 fc ff ff ff mov -0x4(%ebx),%eax
80482a1: 85 c0 test %eax,%eax
80482a3: 74 05 je 80482aa <_init+0x1e>
80482a5: e8 26 00 00 00 call 80482d0 <__libc_start_main@plt+0x10>
80482aa: 83 c4 08 add $0x8,%esp
80482ad: 5b pop %ebx
80482ae: c3 ret
Disassembly of section .plt:
080482b0 <__libc_start_main@plt-0x10>:
80482b0: ff 35 04 a0 04 08 pushl 0x804a004
80482b6: ff 25 08 a0 04 08 jmp *0x804a008
80482bc: 00 00 add %al,(%eax)
...
080482c0 <__libc_start_main@plt>:
80482c0: ff 25 0c a0 04 08 jmp *0x804a00c
80482c6: 68 00 00 00 00 push $0x0
80482cb: e9 e0 ff ff ff jmp 80482b0 <_init+0x24>
Disassembly of section .plt.got:
080482d0 <.plt.got>:
80482d0: ff 25 fc 9f 04 08 jmp *0x8049ffc
80482d6: 66 90 xchg %ax,%ax
Disassembly of section .text:
080482e0 <main>:
80482e0: b8 e8 03 00 00 mov $0x3e8,%eax
80482e5: c3 ret
080482e6 <_start>:
80482e6: 31 ed xor %ebp,%ebp
80482e8: 5e pop %esi
80482e9: 89 e1 mov %esp,%ecx
80482eb: 83 e4 f0 and $0xfffffff0,%esp
80482ee: 50 push %eax
80482ef: 54 push %esp
80482f0: 52 push %edx
80482f1: 68 40 84 04 08 push $0x8048440
80482f6: 68 e0 83 04 08 push $0x80483e0
80482fb: 51 push %ecx
80482fc: 56 push %esi
80482fd: 68 e0 82 04 08 push $0x80482e0
8048302: e8 b9 ff ff ff call 80482c0 <__libc_start_main@plt>
8048307: f4 hlt
8048308: 66 90 xchg %ax,%ax
804830a: 66 90 xchg %ax,%ax
804830c: 66 90 xchg %ax,%ax
804830e: 66 90 xchg %ax,%ax
08048310 <__x86.get_pc_thunk.bx>:
8048310: 8b 1c 24 mov (%esp),%ebx
8048313: c3 ret
8048314: 66 90 xchg %ax,%ax
8048316: 66 90 xchg %ax,%ax
8048318: 66 90 xchg %ax,%ax
804831a: 66 90 xchg %ax,%ax
804831c: 66 90 xchg %ax,%ax
804831e: 66 90 xchg %ax,%ax
08048320 <deregister_tm_clones>:
8048320: b8 1b a0 04 08 mov $0x804a01b,%eax
8048325: 2d 18 a0 04 08 sub $0x804a018,%eax
804832a: 83 f8 06 cmp $0x6,%eax
804832d: 76 1a jbe 8048349 <deregister_tm_clones+0x29>
804832f: b8 00 00 00 00 mov $0x0,%eax
8048334: 85 c0 test %eax,%eax
8048336: 74 11 je 8048349 <deregister_tm_clones+0x29>
8048338: 55 push %ebp
8048339: 89 e5 mov %esp,%ebp
804833b: 83 ec 14 sub $0x14,%esp
804833e: 68 18 a0 04 08 push $0x804a018
8048343: ff d0 call *%eax
8048345: 83 c4 10 add $0x10,%esp
8048348: c9 leave
8048349: f3 c3 repz ret
804834b: 90 nop
804834c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi
08048350 <register_tm_clones>:
8048350: b8 18 a0 04 08 mov $0x804a018,%eax
8048355: 2d 18 a0 04 08 sub $0x804a018,%eax
804835a: c1 f8 02 sar $0x2,%eax
804835d: 89 c2 mov %eax,%edx
804835f: c1 ea 1f shr $0x1f,%edx
8048362: 01 d0 add %edx,%eax
8048364: d1 f8 sar %eax
8048366: 74 1b je 8048383 <register_tm_clones+0x33>
8048368: ba 00 00 00 00 mov $0x0,%edx
804836d: 85 d2 test %edx,%edx
804836f: 74 12 je 8048383 <register_tm_clones+0x33>
8048371: 55 push %ebp
8048372: 89 e5 mov %esp,%ebp
8048374: 83 ec 10 sub $0x10,%esp
8048377: 50 push %eax
8048378: 68 18 a0 04 08 push $0x804a018
804837d: ff d2 call *%edx
804837f: 83 c4 10 add $0x10,%esp
8048382: c9 leave
8048383: f3 c3 repz ret
8048385: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi
8048389: 8d bc 27 00 00 00 00 lea 0x0(%edi,%eiz,1),%edi
08048390 <__do_global_dtors_aux>:
8048390: 80 3d 18 a0 04 08 00 cmpb $0x0,0x804a018
8048397: 75 13 jne 80483ac <__do_global_dtors_aux+0x1c>
8048399: 55 push %ebp
804839a: 89 e5 mov %esp,%ebp
804839c: 83 ec 08 sub $0x8,%esp
804839f: e8 7c ff ff ff call 8048320 <deregister_tm_clones>
80483a4: c6 05 18 a0 04 08 01 movb $0x1,0x804a018
80483ab: c9 leave
80483ac: f3 c3 repz ret
80483ae: 66 90 xchg %ax,%ax
080483b0 <frame_dummy>:
80483b0: b8 10 9f 04 08 mov $0x8049f10,%eax
80483b5: 8b 10 mov (%eax),%edx
80483b7: 85 d2 test %edx,%edx
80483b9: 75 05 jne 80483c0 <frame_dummy+0x10>
80483bb: eb 93 jmp 8048350 <register_tm_clones>
80483bd: 8d 76 00 lea 0x0(%esi),%esi
80483c0: ba 00 00 00 00 mov $0x0,%edx
80483c5: 85 d2 test %edx,%edx
80483c7: 74 f2 je 80483bb <frame_dummy+0xb>
80483c9: 55 push %ebp
80483ca: 89 e5 mov %esp,%ebp
80483cc: 83 ec 14 sub $0x14,%esp
80483cf: 50 push %eax
80483d0: ff d2 call *%edx
80483d2: 83 c4 10 add $0x10,%esp
80483d5: c9 leave
80483d6: e9 75 ff ff ff jmp 8048350 <register_tm_clones>
80483db: 66 90 xchg %ax,%ax
80483dd: 66 90 xchg %ax,%ax
80483df: 90 nop
080483e0 <__libc_csu_init>:
80483e0: 55 push %ebp
80483e1: 57 push %edi
80483e2: 56 push %esi
80483e3: 53 push %ebx
80483e4: e8 27 ff ff ff call 8048310 <__x86.get_pc_thunk.bx>
80483e9: 81 c3 17 1c 00 00 add $0x1c17,%ebx
80483ef: 83 ec 0c sub $0xc,%esp
80483f2: 8b 6c 24 20 mov 0x20(%esp),%ebp
80483f6: 8d b3 0c ff ff ff lea -0xf4(%ebx),%esi
80483fc: e8 8b fe ff ff call 804828c <_init>
8048401: 8d 83 08 ff ff ff lea -0xf8(%ebx),%eax
8048407: 29 c6 sub %eax,%esi
8048409: c1 fe 02 sar $0x2,%esi
804840c: 85 f6 test %esi,%esi
804840e: 74 25 je 8048435 <__libc_csu_init+0x55>
8048410: 31 ff xor %edi,%edi
8048412: 8d b6 00 00 00 00 lea 0x0(%esi),%esi
8048418: 83 ec 04 sub $0x4,%esp
804841b: ff 74 24 2c pushl 0x2c(%esp)
804841f: ff 74 24 2c pushl 0x2c(%esp)
8048423: 55 push %ebp
8048424: ff 94 bb 08 ff ff ff call *-0xf8(%ebx,%edi,4)
804842b: 83 c7 01 add $0x1,%edi
804842e: 83 c4 10 add $0x10,%esp
8048431: 39 f7 cmp %esi,%edi
8048433: 75 e3 jne 8048418 <__libc_csu_init+0x38>
8048435: 83 c4 0c add $0xc,%esp
8048438: 5b pop %ebx
8048439: 5e pop %esi
804843a: 5f pop %edi
804843b: 5d pop %ebp
804843c: c3 ret
804843d: 8d 76 00 lea 0x0(%esi),%esi
08048440 <__libc_csu_fini>:
8048440: f3 c3 repz ret
Disassembly of section .fini:
08048444 <_fini>:
8048444: 53 push %ebx
8048445: 83 ec 08 sub $0x8,%esp
8048448: e8 c3 fe ff ff call 8048310 <__x86.get_pc_thunk.bx>
804844d: 81 c3 b3 1b 00 00 add $0x1bb3,%ebx
8048453: 83 c4 08 add $0x8,%esp
8048456: 5b pop %ebx
8048457: c3 ret
int main(void) {
int variable = 0;
while(variable < 1000) {
variable++;
}
return variable;
}
bucle: file format elf32-i386
Disassembly of section .init:
0804828c <_init>:
804828c: 53 push %ebx
804828d: 83 ec 08 sub $0x8,%esp
8048290: e8 7b 00 00 00 call 8048310 <__x86.get_pc_thunk.bx>
8048295: 81 c3 6b 1d 00 00 add $0x1d6b,%ebx
804829b: 8b 83 fc ff ff ff mov -0x4(%ebx),%eax
80482a1: 85 c0 test %eax,%eax
80482a3: 74 05 je 80482aa <_init+0x1e>
80482a5: e8 26 00 00 00 call 80482d0 <__libc_start_main@plt+0x10>
80482aa: 83 c4 08 add $0x8,%esp
80482ad: 5b pop %ebx
80482ae: c3 ret
Disassembly of section .plt:
080482b0 <__libc_start_main@plt-0x10>:
80482b0: ff 35 04 a0 04 08 pushl 0x804a004
80482b6: ff 25 08 a0 04 08 jmp *0x804a008
80482bc: 00 00 add %al,(%eax)
...
080482c0 <__libc_start_main@plt>:
80482c0: ff 25 0c a0 04 08 jmp *0x804a00c
80482c6: 68 00 00 00 00 push $0x0
80482cb: e9 e0 ff ff ff jmp 80482b0 <_init+0x24>
Disassembly of section .plt.got:
080482d0 <.plt.got>:
80482d0: ff 25 fc 9f 04 08 jmp *0x8049ffc
80482d6: 66 90 xchg %ax,%ax
Disassembly of section .text:
080482e0 <_start>:
80482e0: 31 ed xor %ebp,%ebp
80482e2: 5e pop %esi
80482e3: 89 e1 mov %esp,%ecx
80482e5: 83 e4 f0 and $0xfffffff0,%esp
80482e8: 50 push %eax
80482e9: 54 push %esp
80482ea: 52 push %edx
80482eb: 68 60 84 04 08 push $0x8048460
80482f0: 68 00 84 04 08 push $0x8048400
80482f5: 51 push %ecx
80482f6: 56 push %esi
80482f7: 68 db 83 04 08 push $0x80483db
80482fc: e8 bf ff ff ff call 80482c0 <__libc_start_main@plt>
8048301: f4 hlt
8048302: 66 90 xchg %ax,%ax
8048304: 66 90 xchg %ax,%ax
8048306: 66 90 xchg %ax,%ax
8048308: 66 90 xchg %ax,%ax
804830a: 66 90 xchg %ax,%ax
804830c: 66 90 xchg %ax,%ax
804830e: 66 90 xchg %ax,%ax
08048310 <__x86.get_pc_thunk.bx>:
8048310: 8b 1c 24 mov (%esp),%ebx
8048313: c3 ret
8048314: 66 90 xchg %ax,%ax
8048316: 66 90 xchg %ax,%ax
8048318: 66 90 xchg %ax,%ax
804831a: 66 90 xchg %ax,%ax
804831c: 66 90 xchg %ax,%ax
804831e: 66 90 xchg %ax,%ax
08048320 <deregister_tm_clones>:
8048320: b8 1b a0 04 08 mov $0x804a01b,%eax
8048325: 2d 18 a0 04 08 sub $0x804a018,%eax
804832a: 83 f8 06 cmp $0x6,%eax
804832d: 76 1a jbe 8048349 <deregister_tm_clones+0x29>
804832f: b8 00 00 00 00 mov $0x0,%eax
8048334: 85 c0 test %eax,%eax
8048336: 74 11 je 8048349 <deregister_tm_clones+0x29>
8048338: 55 push %ebp
8048339: 89 e5 mov %esp,%ebp
804833b: 83 ec 14 sub $0x14,%esp
804833e: 68 18 a0 04 08 push $0x804a018
8048343: ff d0 call *%eax
8048345: 83 c4 10 add $0x10,%esp
8048348: c9 leave
8048349: f3 c3 repz ret
804834b: 90 nop
804834c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi
08048350 <register_tm_clones>:
8048350: b8 18 a0 04 08 mov $0x804a018,%eax
8048355: 2d 18 a0 04 08 sub $0x804a018,%eax
804835a: c1 f8 02 sar $0x2,%eax
804835d: 89 c2 mov %eax,%edx
804835f: c1 ea 1f shr $0x1f,%edx
8048362: 01 d0 add %edx,%eax
8048364: d1 f8 sar %eax
8048366: 74 1b je 8048383 <register_tm_clones+0x33>
8048368: ba 00 00 00 00 mov $0x0,%edx
804836d: 85 d2 test %edx,%edx
804836f: 74 12 je 8048383 <register_tm_clones+0x33>
8048371: 55 push %ebp
8048372: 89 e5 mov %esp,%ebp
8048374: 83 ec 10 sub $0x10,%esp
8048377: 50 push %eax
8048378: 68 18 a0 04 08 push $0x804a018
804837d: ff d2 call *%edx
804837f: 83 c4 10 add $0x10,%esp
8048382: c9 leave
8048383: f3 c3 repz ret
8048385: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi
8048389: 8d bc 27 00 00 00 00 lea 0x0(%edi,%eiz,1),%edi
08048390 <__do_global_dtors_aux>:
8048390: 80 3d 18 a0 04 08 00 cmpb $0x0,0x804a018
8048397: 75 13 jne 80483ac <__do_global_dtors_aux+0x1c>
8048399: 55 push %ebp
804839a: 89 e5 mov %esp,%ebp
804839c: 83 ec 08 sub $0x8,%esp
804839f: e8 7c ff ff ff call 8048320 <deregister_tm_clones>
80483a4: c6 05 18 a0 04 08 01 movb $0x1,0x804a018
80483ab: c9 leave
80483ac: f3 c3 repz ret
80483ae: 66 90 xchg %ax,%ax
080483b0 <frame_dummy>:
80483b0: b8 10 9f 04 08 mov $0x8049f10,%eax
80483b5: 8b 10 mov (%eax),%edx
80483b7: 85 d2 test %edx,%edx
80483b9: 75 05 jne 80483c0 <frame_dummy+0x10>
80483bb: eb 93 jmp 8048350 <register_tm_clones>
80483bd: 8d 76 00 lea 0x0(%esi),%esi
80483c0: ba 00 00 00 00 mov $0x0,%edx
80483c5: 85 d2 test %edx,%edx
80483c7: 74 f2 je 80483bb <frame_dummy+0xb>
80483c9: 55 push %ebp
80483ca: 89 e5 mov %esp,%ebp
80483cc: 83 ec 14 sub $0x14,%esp
80483cf: 50 push %eax
80483d0: ff d2 call *%edx
80483d2: 83 c4 10 add $0x10,%esp
80483d5: c9 leave
80483d6: e9 75 ff ff ff jmp 8048350 <register_tm_clones>
080483db <main>:
80483db: 55 push %ebp
80483dc: 89 e5 mov %esp,%ebp
80483de: 83 ec 10 sub $0x10,%esp
80483e1: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp)
80483e8: eb 04 jmp 80483ee <main+0x13>
80483ea: 83 45 fc 01 addl $0x1,-0x4(%ebp)
80483ee: 81 7d fc e7 03 00 00 cmpl $0x3e7,-0x4(%ebp)
80483f5: 7e f3 jle 80483ea <main+0xf>
80483f7: 8b 45 fc mov -0x4(%ebp),%eax
80483fa: c9 leave
80483fb: c3 ret
80483fc: 66 90 xchg %ax,%ax
80483fe: 66 90 xchg %ax,%ax
08048400 <__libc_csu_init>:
8048400: 55 push %ebp
8048401: 57 push %edi
8048402: 56 push %esi
8048403: 53 push %ebx
8048404: e8 07 ff ff ff call 8048310 <__x86.get_pc_thunk.bx>
8048409: 81 c3 f7 1b 00 00 add $0x1bf7,%ebx
804840f: 83 ec 0c sub $0xc,%esp
8048412: 8b 6c 24 20 mov 0x20(%esp),%ebp
8048416: 8d b3 0c ff ff ff lea -0xf4(%ebx),%esi
804841c: e8 6b fe ff ff call 804828c <_init>
8048421: 8d 83 08 ff ff ff lea -0xf8(%ebx),%eax
8048427: 29 c6 sub %eax,%esi
8048429: c1 fe 02 sar $0x2,%esi
804842c: 85 f6 test %esi,%esi
804842e: 74 25 je 8048455 <__libc_csu_init+0x55>
8048430: 31 ff xor %edi,%edi
8048432: 8d b6 00 00 00 00 lea 0x0(%esi),%esi
8048438: 83 ec 04 sub $0x4,%esp
804843b: ff 74 24 2c pushl 0x2c(%esp)
804843f: ff 74 24 2c pushl 0x2c(%esp)
8048443: 55 push %ebp
8048444: ff 94 bb 08 ff ff ff call *-0xf8(%ebx,%edi,4)
804844b: 83 c7 01 add $0x1,%edi
804844e: 83 c4 10 add $0x10,%esp
8048451: 39 f7 cmp %esi,%edi
8048453: 75 e3 jne 8048438 <__libc_csu_init+0x38>
8048455: 83 c4 0c add $0xc,%esp
8048458: 5b pop %ebx
8048459: 5e pop %esi
804845a: 5f pop %edi
804845b: 5d pop %ebp
804845c: c3 ret
804845d: 8d 76 00 lea 0x0(%esi),%esi
08048460 <__libc_csu_fini>:
8048460: f3 c3 repz ret
Disassembly of section .fini:
08048464 <_fini>:
8048464: 53 push %ebx
8048465: 83 ec 08 sub $0x8,%esp
8048468: e8 a3 fe ff ff call 8048310 <__x86.get_pc_thunk.bx>
804846d: 81 c3 93 1b 00 00 add $0x1b93,%ebx
8048473: 83 c4 08 add $0x8,%esp
8048476: 5b pop %ebx
8048477: c3 ret
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment