Tema destacado: Únete al Grupo Steam elhacker.NET
Autor
|
Tema: [Asm]Dudas con execve syscall (Leído 2,086 veces)
|
|
NewLog
|
Muy buenas! Tengo una pequeña duda, supongo que conceptual, con el siguiente código: BITS 32 xor eax, eax xor ecx, ecx cdq jmp short texto code: pop ebx mov al, 11 int 0x80 texto: call code db '/bin/nc' Se trata de usar la syscall execve y ejecutar el netcat que ya está instalado en la máquina. El resultado que me da ese código es el siguiente: TheWhiteRabbit:/home/follow/Shellcoding/Codigos# ./s-proc -e Hello Calling code ... no destination
Sin embargo cuando ejecuto el mismo código con /bin/cp me devuelve lo correcto: TheWhiteRabbit:/home/follow/Shellcoding/Codigos# ./s-proc -e Hello Calling code ... : missing file operand Try `(null) --help' for more information.
La única diferencia a ejecutar un simple cp es que donde pone "null", pone "cp". Tampoco entiendo este cambio... Además, y por último, cuando ejecuto /bin/sh : TheWhiteRabbit:/home/follow/Shellcoding/Codigos# ./s-proc -e Hello Calling code ... TheWhiteRabbit:/home/follow/Shellcoding/Codigos# clear TERM environment variable not set.
No se si ejecuta como debe... ya que después cuando hago un clear... ya véis lo que me devuelve... no lo entiendo  A ver si alguien puede echarme una mano! Por cierto mi so es Debian 4.0 stable! Además, ejecuto el código con la utilidad llamada s-proc como podéis ver... P.D.: Este mensaje ya lo he posteado en el apartado de programación general, pero ahí nadie me ha podido dar una respuesta! Y igual que yo, seguroq ue hay gente que no pasa por todas las secciones de este foro, así que lo posteo aquí por si hay alguien que no se pasa por ahí y puede echarme una mano. Además, se trata de ejecutar una shellcode ^^
|
|
|
|
|
En línea
|
|
|
|
sirdarckcat
Troll Buena Onda y
CoAdmin
 
Desconectado
Mensajes: 6.947
Lavando Platos
|
Intenta haciendo push ebx mov ecx, esp antes del int 0x80 y cambia el xor ecx,ecx por xor edx, edx Saludos!! **edit http://asm.sourceforge.net/articles/startup.html
|
|
|
|
« Última modificación: 21 Julio 2008, 04:57 por sirdarckcat »
|
En línea
|
|
|
|
|
NewLog
|
Gracias a dios que has contestado, creía que ya nadie tendría piedad de mi  El caso, me he leído todo el texto y la verdad es que me he quedado un poco parado. No lo acabo de entender. He visto que dependiendo de a versión del kernel, antes de la llamada a execve() algunos registros están a 0 y otros no. Y además como está la pila antes de su ejecución. En cuanto a las modificaciones que me comentas, ya me imagino por que las dices. El: push ebx mov ecx, esp Con el push ebx, metes la dirección que apunta a /bin/nc en la pila, y con el mov ecx, esp pones en ecx la dirección al último dato pusheado (o sea, pones la dirección donde se encuentra la dirección que apunta a /bin/nc). Y eso lo haces porqué como segundo parámetro del execve() le quieres pasar /bin/nc, o sea, execve("/bin/nc", "/bin/nc",0). Yo en cambio, lo que hago es un execve("/bin/nc",0,0). No es eso lo que quieres hacer? Sin embargo, o no lo entiendo o no es correcto. No sería mejor poner el mov ecx, ebx justo después del pop ebx ??? El xor edx, edx que comentas, lo hago con la instrucción cdq. El caso es que he probado tu código tal y como has dicho y me ha dado un buen core dumped  y si hago lo del mov ecx, ebx se queda "pensando" sin hacer nada. Gracias de nuevo sirdarckcat, por cierto, eres tu el que está en el rànking de blind security? (sdc). Si es así, "felicidades" 
|
|
|
|
|
En línea
|
|
|
|
|
NewLog
|
De tu código lo que causa el core dumped es el push ebx.
|
|
|
|
|
En línea
|
|
|
|
sirdarckcat
Troll Buena Onda y
CoAdmin
 
Desconectado
Mensajes: 6.947
Lavando Platos
|
Si pues la idea es esa.. pero tienes que mandar un arreglo como segundo argumento, osea que sea ("/bin/nc",{"/bin/nc"},0)
Y pues si soy yo el de blindsec, pero ya me cayó mal jajaja ese reto de estegano era una mentada..
|
|
|
|
|
En línea
|
|
|
|
|
NewLog
|
No entiendo muy bien para qué sirven los { } o qué significan. Es la dirección a la cadena? Además tampoco entiendo porqué h***** me da la violación de segmento al hacerle un push de ebx.
Unos cuantos de wadalbertia estamos jugando en el torneo, y los que van más avanzados ya dicen que la prueba d'esteganografía es bastante jodida!
|
|
|
|
|
En línea
|
|
|
|
sirdarckcat
Troll Buena Onda y
CoAdmin
 
Desconectado
Mensajes: 6.947
Lavando Platos
|
si los {} eran un array xD aver sintaxis de javascript:
sys_execve("/bin/nc",["/bin/nc"],0x00);
|
|
|
|
|
En línea
|
|
|
|
|
NewLog
|
Al final he tenido que mirar un ejemplo para conseguir hacer la shellcode con el" jmp/call trick", qué rabia... El código final es este: BITS 32 ;Indicamos a nasm (el compilador) que genere un código para una arquitectura de 32 bits jmp short texto ;Aquí empieza el jmp/call trick. Salta a texto. Ahorramos un byte con el 'short'. code: pop ebx ;Ponemos en ebx la direccion donde se encuentra '/bin/sh'. Será el primer argumento de la syscall. xor eax, eax ;Ponemos a 0 el registro eax cdq ;Ponemos a 0 el registro edx gracias a que eax es 0. Nos ahorramos un byte. mov byte [ebx+7], al ;Ponemos un null-byte al final de la cadena /bin/sh. mov [ebx+8], ebx mov byte [ebx+12], al lea ecx, [ebx+8] mov al, 11 ;En eax ponemos el valor de la execve syscall. Trabajando con al nos ahorramos un byte. int 0x80 ;Ejecutamos la syscall. texto: call code ;Llamamos a code. En la pila se almacena la dirección donde se encuentra '/bin/sh'. db '/bin/nc' Sin embargo hay cosas que no entiendo, y te estaría muy agradecido si pudiéras resolver mis dudas: 1) Cuando hacemos el pop ebx, en ebx tenemos la dirección donde está almacenada la cadena, no la cadena en cuestión. Con la siguiente instrucción mov byte [ebx+7], al se supone que ponemos un byte nulo al final de la cadena /bin/sh, pero lo que hace literalmente esa instrucción es poner en la dirección donde se encuentra ebx más 7 bytes, un byte nulo, no? Sin embargo, la dirección donde se encuentra ebx no es la dirección donde se encuentra la cadena, por tanto no entiendo como se pone el null-byte al final de la cadena... 2) Cuando cargamos el puntero a la cadena /bin/sh en ecx con: lea ecx, [ebx+8], no entiendo porqué no podemos hacer un lea ecx, [ebx] y saltarnos el: mov [ebx+8], ebx mov byte [ebx+12], al Este código lo único que hace es poner en la pila la dirección hacia /bin/sh y un null byte... Pero eso ya lo tenemos en la pila... Porqué volverlo meter si ya lo tienes puesto? Evidentemente, con los cambios que comento la shellcode no funciona... Gracias de antemano
|
|
|
|
|
En línea
|
|
|
|
sirdarckcat
Troll Buena Onda y
CoAdmin
 
Desconectado
Mensajes: 6.947
Lavando Platos
|
1) No, si se pone un byte nulo despues de /bin/sh, mov byte [ebx], al mueve el byte nulo a "/", mov byte [ebx+1], al lo mueve a "b", mov byte [ebx+2], al a "i", etc.. 2) Eso es por lo que ya te dije, que es un arreglo, y un arreglo apunta a N cantidad de direcciones que tienen las direcciones de M datos, en este caso tiene 1 direccion (ebx) que apunta a 1 dato (/bin/sh).
Saludos!!
|
|
|
|
|
En línea
|
|
|
|
|
|