elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Obtener argumentos pasados al programa
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Obtener argumentos pasados al programa  (Leído 5,088 veces)
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Obtener argumentos pasados al programa
« en: 29 Marzo 2014, 14:13 pm »

Hola, tengo la duda de cómo conseguir los argumentos pasados al programa.
La cantidad de argumentos, seguido de la ruta del programa y de las demás cadenas.
Tenía entendido que se almacenaban en el stack, pero ahí no los ví, así que pregunto por aquí :3

PD: Uso FASM


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.967


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Obtener argumentos pasados al programa
« Respuesta #1 en: 29 Marzo 2014, 14:25 pm »

¿S.O.? Para Windows llama a GetCommandLine y extrae los parametros de la cadena devuelta.


En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Obtener argumentos pasados al programa
« Respuesta #2 en: 29 Marzo 2014, 17:03 pm »

Okay, thanks. Pensé que se podría hacer sin la API de windows. Pero veo que hay mucho monopolio jaja
En línea

xv0


Desconectado Desconectado

Mensajes: 1.027



Ver Perfil
Re: Obtener argumentos pasados al programa
« Respuesta #3 en: 29 Marzo 2014, 18:33 pm »

Pues claro que se puede hacer sin la API, si es cierto esta en el stack pero en la parte superior, yo en el primer pop sin tocar la pila me dice los numeros de parametros que pase en la shell.

Código:
ktrace ./prueba parametro

Código
  1. popq %rdi
  2. incl %eax
  3. syscall

Obtendria 0x2, en rdi.

Si sigo augmentando en la pila vere las cadenas las rutas y los parametros.

Código
  1. movq 8(%rsp), %rdi
  2. movq (%rdi), %rdi   ; piensa que es un puntero

Depende de los bytes que quiera imprimir la cadena sera mas extensa o no, por cierto todo esto esta probado en unix-like, no se si te valdra para Windows creo que si.

Un saludo.
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Obtener argumentos pasados al programa
« Respuesta #4 en: 29 Marzo 2014, 18:40 pm »

Había hecho pruebas, pero en la pila no encontré el número de parámetros, ni tampoco las cadenas. Eché un vistazo a la pila con el OllyDBG, y tampoco encontré nada. No se. Yo uso Win7, pero no creo que tenga que ver con eso.

Por cierto, veo que usas el registro DI. Tengo entendido que es el "índice de destino", y que tiene un par de instrucciones especiales que solo funcionan con él y con SI.
¿Se pueden usar como si fueran registros generales? ¿O hay alguna pega?

:3 thx
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.967


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Obtener argumentos pasados al programa
« Respuesta #5 en: 29 Marzo 2014, 20:07 pm »

Pues claro que se puede hacer sin la API, si es cierto esta en el stack ... en unix-like, no se si te valdra para Windows creo que si.

No, no lo esta, por eso pregunte para que S.O. era, si escribis un programa en C/C++ podras ver como la RTL se encarga de llamar a GetCommandLine y parsear la cadena para obtener argc y argv.

ivancea96: no pierdas el tiempo.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
xv0


Desconectado Desconectado

Mensajes: 1.027



Ver Perfil
Re: Obtener argumentos pasados al programa
« Respuesta #6 en: 29 Marzo 2014, 20:33 pm »

@Eternal Idol

Simplemente pense que se podrian conseguir esos valores igual que en sistemas Unix-like, error mio, tampoco lo veo una perdida de tiempo saber como funcionan las cosas sin llamar a una API.

@ivancea96

Y bueno sobre lo que preguntas sobre el registro DI, utilizo DI porque es el primer parametro para pasar los valores a las syscall de sistemas Unix-like, claro DI no deja de ser un registro de general purpose, DI y SI estan enlazados por instrucciones para mover cadenas ejemplo movs etc...

Un saludo.
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.967


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Obtener argumentos pasados al programa
« Respuesta #7 en: 29 Marzo 2014, 20:53 pm »

Simplemente pense que se podrian conseguir esos valores igual que en sistemas Unix-like, error mio, tampoco lo veo una perdida de tiempo saber como funcionan las cosas sin llamar a una API.

No, perder el tiempo seria continuar buscando en la pila lo que no esta ella, por eso se lo dije a otra persona y no a vos. Saber como funcionan la cosas es muy util, nadie dijo lo contrario. La linea de comandos esta en el PEB (Process Environment Block).

0:000> u kernel32!getcommandlinew
kernel32!GetCommandLineW:
00000000`775ac428 ff25ea160800    jmp     qword ptr [kernel32!_imp_GetCommandLineW (00000000`7762db18)]

0:000> u poi(7762db18)
KERNELBASE!GetCommandLineW:
000007fe`fd5ecb70 488b05713b0500  mov     rax,qword ptr [KERNELBASE!BaseUnicodeCommandLine+0x8 (000007fe`fd6406e8)]
000007fe`fd5ecb77 c3              ret

0:000> du poi(000007fe`fd6406e8)
00000000`003034ac  "C:\Windows\System32\calc.exe"

0:000> !peb
PEB at 000007fffffdf000
....

0:000> dt ntdll!_PEB 000007fffffdf000
   +0x000 InheritedAddressSpace : 0 ''
   +0x001 ReadImageFileExecOptions : 0 ''
   +0x002 BeingDebugged    : 0x1 ''
   +0x003 BitField         : 0x8 ''
   +0x003 ImageUsesLargePages : 0y0
   +0x003 IsProtectedProcess : 0y0
   +0x003 IsLegacyProcess  : 0y0
   +0x003 IsImageDynamicallyRelocated : 0y1
   +0x003 SkipPatchingUser32Forwarders : 0y0
   +0x003 SpareBits        : 0y000
   +0x008 Mutant           : 0xffffffff`ffffffff Void
   +0x010 ImageBaseAddress : 0x00000000`ff170000 Void
   +0x018 Ldr              : 0x00000000`777e2640 _PEB_LDR_DATA
  +0x020 ProcessParameters : 0x00000000`00302690 _RTL_USER_PROCESS_PARAMETERS
.....


0:000> dt -b ntdll!_RTL_USER_PROCESS_PARAMETERS CommandLine. 0x00000000`00302690
   +0x070 CommandLine  :  "C:\Windows\System32\calc.exe"
      +0x000 Length       : 0x38
      +0x002 MaximumLength : 0x3a
     +0x008 Buffer       : 0x00000000`003034ac  "C:\Windows\System32\calc.exe"

De yapa, sabiendo lo anterior y como obtener el PEB se puede obtener la linea de comandos sin API en x64:

0:000> u ntdll!RtlGetCurrentPeb
ntdll!RtlGetCurrentPeb:
00000000`77760600 65488b042530000000 mov   rax,qword ptr gs:[30h]
00000000`77760609 488b4060        mov     rax,qword ptr [rax+60h]
00000000`7776060d c3              ret

Eso si, el PEB podria cambiar en cualquier momento como dice la documentacion. Por eso mejor usar la simple API en este caso.
« Última modificación: 29 Marzo 2014, 21:00 pm por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Danyfirex


Desconectado Desconectado

Mensajes: 493


My Dear Mizuho


Ver Perfil
Re: Obtener argumentos pasados al programa
« Respuesta #8 en: 1 Abril 2014, 14:57 pm »

Hola. otra cosa que podrías hacer es usar CommandLineToArgv y obtener pNumArgs.


Saludos
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.967


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Obtener argumentos pasados al programa
« Respuesta #9 en: 1 Abril 2014, 15:14 pm »

Con CommandLineToArgvW (no hay version ANSI) obtenes los argc (pNumArgs) y argv (eax) de C/C++ pero a esa funcion igual le tenes que pasar la linea de comandos, es un complemento no una alternativa.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[SOURCE] Autodestrucción pasados X días « 1 2 »
Programación Visual Basic
jmordenata 14 5,384 Último mensaje 28 Marzo 2008, 02:03 am
por Sh4k4
Como hago para que mi programa acepte argumentos por linea de comando? (VB.Net)
.NET (C#, VB.NET, ASP)
70N1 5 12,534 Último mensaje 30 Enero 2010, 19:12 pm
por DragonFire
¿Como veo mis temas pasados en el foro?
Sugerencias y dudas sobre el Foro
isaaxlol 8 4,582 Último mensaje 13 Junio 2011, 10:01 am
por Mardorx
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines