que paises pais mexico llamadas internacionales internacional discado directo codigos codigo ciudades celulares c linux assembly linux-kernel att

paises - de que pais es el codigo 001



Newbie asm: ¿dónde está el código de llamada? (1)

Escribí este simple módulo kernel:

#include <linux/module.h> // for printk() int init( void ) { printk( "n Kello, everybody! nn" ); return 0; } void exit( void ) { printk( "n Goodbye now... nn" ); } MODULE_LICENSE("GPL"); module_init(init); module_exit(exit);

y trato de entender cómo se traduce el código a asm, así que lo superé:

root@ubuntu:/home/alex/Desktop/KModule# objdump -D kmodule.ko kmodule.ko: file format elf64-x86-64 Disassembly of section .note.gnu.build-id: 0000000000000000 <.note.gnu.build-id>: 0: 04 00 add $0x0,%al 2: 00 00 add %al,(%rax) 4: 14 00 adc $0x0,%al 6: 00 00 add %al,(%rax) 8: 03 00 add (%rax),%eax a: 00 00 add %al,(%rax) c: 47 rex.RXB d: 4e 55 rex.WRX push %rbp f: 00 5e ef add %bl,-0x11(%rsi) 12: 7d 73 jge 87 <__mod_vermagic5+0x4f> 14: 83 47 e9 4d addl $0x4d,-0x17(%rdi) 18: 98 cwtl 19: eb b8 jmp ffffffffffffffd3 <__mod_vermagic5+0xffffffffffffff9b> 1b: eb 18 jmp 35 <__module_depends+0x6> 1d: fb sti 1e: 84 28 test %ch,(%rax) 20: 73 db jae fffffffffffffffd <__mod_vermagic5+0xffffffffffffffc5> 22: 51 push %rcx 23: e4 .byte 0xe4 Disassembly of section .text: 0000000000000000 <init>: 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 4: e8 00 00 00 00 callq 9 <init+0x9> 9: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 10: 31 c0 xor %eax,%eax 12: e8 00 00 00 00 callq 17 <init+0x17> 17: 31 c0 xor %eax,%eax 19: 5d pop %rbp 1a: c3 retq 1b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0000000000000020 <cleanup_module>: 20: 55 push %rbp 21: 48 89 e5 mov %rsp,%rbp 24: e8 00 00 00 00 callq 29 <cleanup_module+0x9> 29: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 30: 31 c0 xor %eax,%eax 32: e8 00 00 00 00 callq 37 <cleanup_module+0x17> 37: 5d pop %rbp 38: c3 retq 39: 00 00 add %al,(%rax) ... Disassembly of section .rodata.str1.1: 0000000000000000 <.rodata.str1.1>: 0: 0a 20 or (%rax),%ah 2: 20 20 and %ah,(%rax) 4: 4b rex.WXB 5: 65 gs 6: 6c insb (%dx),%es:(%rdi) 7: 6c insb (%dx),%es:(%rdi) 8: 6f outsl %ds:(%rsi),(%dx) 9: 2c 20 sub $0x20,%al b: 65 gs c: 76 65 jbe 73 <__mod_vermagic5+0x3b> e: 72 79 jb 89 <__mod_vermagic5+0x51> 10: 62 (bad) 11: 6f outsl %ds:(%rsi),(%dx) 12: 64 fs 13: 79 21 jns 36 <__module_depends+0x7> 15: 20 0a and %cl,(%rdx) 17: 0a 00 or (%rax),%al 19: 0a 20 or (%rax),%ah 1b: 20 20 and %ah,(%rax) 1d: 47 6f rex.RXB outsl %ds:(%rsi),(%dx) 1f: 6f outsl %ds:(%rsi),(%dx) 20: 64 fs 21: 62 (bad) 22: 79 65 jns 89 <__mod_vermagic5+0x51> 24: 20 6e 6f and %ch,0x6f(%rsi) 27: 77 2e ja 57 <__mod_vermagic5+0x1f> 29: 2e 2e 20 0a cs and %cl,%cs:(%rdx) 2d: 0a 00 or (%rax),%al Disassembly of section .modinfo: 0000000000000000 <__mod_license27>: 0: 6c insb (%dx),%es:(%rdi) 1: 69 63 65 6e 73 65 3d imul $0x3d65736e,0x65(%rbx),%esp 8: 47 50 rex.RXB push %r8 a: 4c 00 73 72 rex.WR add %r14b,0x72(%rbx) 000000000000000c <__mod_srcversion31>: c: 73 72 jae 80 <__mod_vermagic5+0x48> e: 63 76 65 movslq 0x65(%rsi),%esi 11: 72 73 jb 86 <__mod_vermagic5+0x4e> 13: 69 6f 6e 3d 45 33 46 imul $0x4633453d,0x6e(%rdi),%ebp 1a: 38 45 32 cmp %al,0x32(%rbp) 1d: 30 39 xor %bh,(%rcx) 1f: 34 37 xor $0x37,%al 21: 44 32 31 xor (%rcx),%r14b 24: 33 30 xor (%rax),%esi 26: 32 35 44 36 39 34 xor 0x34393644(%rip),%dh # 34393670 <__mod_vermagic5+0x34393638> 2c: 34 45 xor $0x45,%al ... 000000000000002f <__module_depends>: 2f: 64 fs 30: 65 gs 31: 70 65 jo 98 <__mod_vermagic5+0x60> 33: 6e outsb %ds:(%rsi),(%dx) 34: 64 fs 35: 73 3d jae 74 <__mod_vermagic5+0x3c> ... 0000000000000038 <__mod_vermagic5>: 38: 76 65 jbe 9f <__mod_vermagic5+0x67> 3a: 72 6d jb a9 <__mod_vermagic5+0x71> 3c: 61 (bad) 3d: 67 69 63 3d 33 2e 30 imul $0x2e302e33,0x3d(%ebx),%esp 44: 2e 45: 30 2d 31 36 2d 67 xor %ch,0x672d3631(%rip) # 672d367c <__mod_vermagic5+0x672d3644> 4b: 65 6e outsb %gs:(%rsi),(%dx) 4d: 65 gs 4e: 72 69 jb b9 <__mod_vermagic5+0x81> 50: 63 20 movslq (%rax),%esp 52: 53 push %rbx 53: 4d 50 rex.WRB push %r8 55: 20 6d 6f and %ch,0x6f(%rbp) 58: 64 fs 59: 5f pop %rdi 5a: 75 6e jne ca <__mod_vermagic5+0x92> 5c: 6c insb (%dx),%es:(%rdi) 5d: 6f outsl %ds:(%rsi),(%dx) 5e: 61 (bad) 5f: 64 20 6d 6f and %ch,%fs:0x6f(%rbp) 63: 64 fs 64: 76 65 jbe cb <__mod_vermagic5+0x93> 66: 72 73 jb db <__mod_vermagic5+0xa3> 68: 69 .byte 0x69 69: 6f outsl %ds:(%rsi),(%dx) 6a: 6e outsb %ds:(%rsi),(%dx) 6b: 73 20 jae 8d <__mod_vermagic5+0x55> ... Disassembly of section __mcount_loc: 0000000000000000 <__mcount_loc>: ... Disassembly of section __versions: 0000000000000000 <____versions>: 0: 73 24 jae 26 <____versions+0x26> 2: 57 push %rdi 3: 41 00 00 add %al,(%r8) 6: 00 00 add %al,(%rax) 8: 6d insl (%dx),%es:(%rdi) 9: 6f outsl %ds:(%rsi),(%dx) a: 64 fs b: 75 6c jne 79 <____versions+0x79> d: 65 gs e: 5f pop %rdi f: 6c insb (%dx),%es:(%rdi) 10: 61 (bad) 11: 79 6f jns 82 <____versions+0x82> 13: 75 74 jne 89 <____versions+0x89> ... 3d: 00 00 add %al,(%rax) 3f: 00 49 a0 add %cl,-0x60(%rcx) 42: e1 27 loope 6b <____versions+0x6b> 44: 00 00 add %al,(%rax) 46: 00 00 add %al,(%rax) 48: 70 72 jo bc <____versions+0xbc> 4a: 69 6e 74 6b 00 00 00 imul $0x6b,0x74(%rsi),%ebp ... 7d: 00 00 add %al,(%rax) 7f: 00 9a 0f 39 b4 00 add %bl,0xb4390f(%rdx) 85: 00 00 add %al,(%rax) 87: 00 6d 63 add %ch,0x63(%rbp) 8a: 6f outsl %ds:(%rsi),(%dx) 8b: 75 6e jne fb <__mod_vermagic5+0xc3> 8d: 74 00 je 8f <____versions+0x8f> ... Disassembly of section .gnu.linkonce.this_module: 0000000000000000 <__this_module>: ... 18: 6b 6d 6f 64 imul $0x64,0x6f(%rbp),%ebp 1c: 75 6c jne 8a <__this_module+0x8a> 1e: 65 00 00 add %al,%gs:(%rax) ... Disassembly of section .comment: 0000000000000000 <.comment>: 0: 00 47 43 add %al,0x43(%rdi) 3: 43 3a 20 rex.XB cmp (%r8),%spl 6: 28 55 62 sub %dl,0x62(%rbp) 9: 75 6e jne 79 <__mod_vermagic5+0x41> b: 74 75 je 82 <__mod_vermagic5+0x4a> d: 2f (bad) e: 4c 69 6e 61 72 6f 20 imul $0x34206f72,0x61(%rsi),%r13 15: 34 16: 2e 36 2e 31 2d 39 75 cs ss xor %ebp,%cs:%ss:0x75627539(%rip) # 75627558 <__mod_vermagic5+0x75627520> 1d: 62 75 1f: 6e outsb %ds:(%rsi),(%dx) 20: 74 75 je 97 <__mod_vermagic5+0x5f> 22: 33 29 xor (%rcx),%ebp 24: 20 34 2e and %dh,(%rsi,%rbp,1) 27: 36 2e 31 00 ss xor %eax,%cs:%ss:(%rax) 2b: 00 47 43 add %al,0x43(%rdi) 2e: 43 3a 20 rex.XB cmp (%r8),%spl 31: 28 55 62 sub %dl,0x62(%rbp) 34: 75 6e jne a4 <__mod_vermagic5+0x6c> 36: 74 75 je ad <__mod_vermagic5+0x75> 38: 2f (bad) 39: 4c 69 6e 61 72 6f 20 imul $0x34206f72,0x61(%rsi),%r13 40: 34 41: 2e 36 2e 31 2d 39 75 cs ss xor %ebp,%cs:%ss:0x75627539(%rip) # 75627583 <__mod_vermagic5+0x7562754b> 48: 62 75 4a: 6e outsb %ds:(%rsi),(%dx) 4b: 74 75 je c2 <__mod_vermagic5+0x8a> 4d: 33 29 xor (%rcx),%ebp 4f: 20 34 2e and %dh,(%rsi,%rbp,1) 52: 36 2e 31 00 ss xor %eax,%cs:%ss:(%rax)

pero algo no se apila con el resto ...

¿cómo se llama la función printk? Solo puedo ver "callq 9", y ese desplazamiento no me dice nada ... es la siguiente instrucción ... ¿y qué? El mensaje "Kello" se imprime correctamente pero no puedo encontrar el código donde sucede esto.

Además ... ¿cómo puede este código acceder a la cadena "Kello, etc." en la sección .rodata.str1.1? Si se trata de un segmento de programa mapeado en el registro ds, ¿no debería haber algo como "ds: 0" para acceder a él?

Estoy bastante confundido ...


Los módulos Kernel son reubicables y vinculados al núcleo cuando se cargan. Las direcciones de memoria reales solo se determinan en ese momento. Esto se debe a que la dirección para las funciones del kernel y la dirección en la que se cargará el módulo no se conocen en tiempo de compilación.

Si miras el bytecode para todas las instrucciones de call , verás que tienen cuatro bytes cero. Cuando se carga el módulo, estos bytes se reemplazarán con la dirección de la función real. Lo mismo es cierto para la dirección de cadena: en la instrucción mov $0x0,%rdi , el cero se reemplazará con la dirección correcta.

La razón por la que ve instrucciones como callq 9 y callq 17 es que la instrucción de call especifica la dirección como relativa a la siguiente instrucción. Como la dirección relativa almacenada en el archivo es 0, el desensamblador lo mostrará como si la instrucción de call invocara la instrucción que lo sigue.

El uso de objdump -r debería mostrarle las reubicaciones del módulo.