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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


  Mostrar Temas
Páginas: 1 [2] 3 4
11  Programación / ASM / Shellcode to HEX (BOF) en: 26 Enero 2017, 23:48 pm
Hola a todos, estoy explotando un bof necesito una ayuda.

Necesito pasar esta serie de instrucciones a hexa para luego ejecutarlo con C.

Código
  1. .section .data
  2. __archivo:
  3. .asciz "/home/httpd/test"  # Archivo a eliminar.
  4.  
  5. .section .text
  6. .global main
  7. main:
  8.        movl $10, %eax    
  9.        movl $__archivo, %ebx    
  10.        int  $0x80
  11.  
  12.        movl %eax, %ebx  
  13.        movl $1, %eax      
  14.        int  $0x80

Quiero pasar este código asm que borra un archivo a C tipo:

Código
  1. char sc[] =  "\xb8\x0a\x00\x00\x00\xbb\x8c\x90\x04\x08\xcd\x80\x89\xc3\xb8\x01\x00\x00\x00\xcd\x80";
  2.  
  3. int main (void){
  4.  
  5.        int (*func)();
  6.        func = (int (*)())sc;
  7.        (int)(*func)();
  8. }


Pero me parece que estoy pasando mal el asm al hexadecimal, ¿cómo puedo pasarlo para ejecutarlo desde C?

Probé hacerlo con objdump pero no funciona.

Saludos.
12  Programación / ASM / ¿Funciones anidadas? en: 21 Noviembre 2016, 18:05 pm
Hola!, estuve buscando por internet pero todavía no me queda del todo claro, alguien sabe algo sobre funciones anidadas?


Algo como esto estoy buscando

Código
  1. void f( int a){
  2.  
  3.       int gg(char v){
  4.             return 1;
  5.      }
  6.       gg('b');
  7.  
  8. }
  9.  

Sí se que se lo puede pasar a ASM con gcc -S, de todos modos no entiendo los procedimientos que hace.


Saludos!
13  Programación / Programación C/C++ / [C-ASM] Pila en: 21 Noviembre 2016, 01:58 am
¿Podrían explicarme un poco mejor como es que funciona stack y hacer_stack?
Código
  1. #include <stdlib.h>
  2. #include <setjmp.h>
  3.  
  4. #define TPILA 4096
  5. #define NPILAS 10
  6.  
  7. static void hace_stack(jmp_buf buf, void (*pf)(), unsigned prof, char *dummy) {
  8.  
  9.        printf ("prof: %d\n",prof);
  10.        printf ("dummy: %d\n",dummy-(char*) &prof );
  11.  
  12.  
  13.        if( dummy - (char *) &prof >= prof) {
  14.                if (setjmp(buf)!=0) {
  15.                        pf(); abort();
  16.                }
  17.        } else hace_stack(buf, pf, prof, dummy);
  18. }
  19.  
  20. void stack(jmp_buf buf, void (*pf)()) {
  21.        static int ctas = NPILAS;
  22.        char dummy;
  23.        hace_stack(buf, pf, TPILA*ctas, &dummy);
  24.        ctas--;
  25. }
  26.  

Código
  1. #include <stdio.h>
  2. #include "guindows.h"
  3.  
  4. task t1, t2, taskmain;
  5.  
  6. void ft1(){
  7. double d;
  8. for(d=-1;;d+=0.001) {
  9. printf("d=%f\n", d);
  10. TRANSFER(t1,t2);
  11. }
  12. }
  13.  
  14. void ft2(){
  15. int i;
  16. for(i=0;i<10000;i++) {
  17. printf("i=%d\n", i);
  18. TRANSFER(t2,t1);
  19. }
  20. TRANSFER(t2, taskmain);
  21. }
  22.  
  23. main(){
  24. stack(t1,ft1);
  25. stack(t2,ft2);
  26. TRANSFER(taskmain,t1);
  27. return 0;
  28. }
  29.  


¿Para qué carajos sirve esto?
Código
  1.        if( dummy - (char *) &prof >= prof) {
  2.                if (setjmp(buf)!=0) {
  3.                        pf(); abort();
  4.                }
  5.        } else hace_stack(buf, pf, prof, dummy);

Me parece una forma muy rara de codear (char *)&prof sé lo que significa pero no entiendo para que sirve.

Todo lo de guindows.h lo entiendo.
14  Programación / Programación C/C++ / [Estrategias] Programación Dinámica vs Divide y conquistarás (DUDA) en: 6 Noviembre 2016, 10:04 am
Hola a todos, la pregunta es bien directa.

No entiendo bien la diferencia entre Programación Dinámica(botton up y top-down)
¿Alguien me podría dar ejemplos de códigos explicando la lógica de cada uno?


¡Saludos!
15  Programación / Programación C/C++ / [Muy específico] Algo de punteros en: 2 Noviembre 2016, 13:27 pm
Creo que ya sé la respuesta, pero por si las dudas pregunto.

Básicamente tengo que invertir una pila, una estructura de datos que la represento como:

Código
  1. typedef struct _AStack {
  2. int data[MAX_STACK];
  3. int back;
  4. }AStack;
  5.  

Acá va la duda:


Código
  1. void astack_reverse (AStack *s){
  2. int i;
  3. AStack *reverse = astack_create();
  4.  
  5. for (i=s->back; i >=0; i--){
  6. astack_push(reverse,s->data[i]);
  7. }
  8. *s = *reverse;
  9. }

La duda está en la última linea *s=*reverse, lo que estoy haciendo es igualar todos los elementos de s a reverse, (ya sé que no es lo más eficiente).

Ahora si yo hago s = reverse (sin *) lo que pasa es que yo estoy modificando una variable global (estoy modificando la dirección donde apunta) y cuando vuelve al main perdí la información. Eso si entiendo ...

¿Pero por qué acá no pasa lo mismo?

Acá estoy implementando pilas pero con otra estructura:

Código
  1. typedef struct _AStack {
  2.        int *data;
  3.        int size;
  4.        int back;
  5. }AStack;


Código
  1. void astack_push(AStack *s, int v){
  2.  
  3.        if (s != NULL){
  4.                if (s->size > s->back){
  5.                        s->back++;
  6.                        s->data[s->back] = v;
  7.                }else{
  8.                        s->size*=2;
  9.                        int *new_data = realloc(s->data,(s->size));
  10.                        if (new_data != NULL) s->data = new_data;
  11.                        else printf ("No se pudo asignar memoria.\n");
  12.                }
  13.        }
  14. }


Me refiero a esta parte:

Código:
                        int *new_data = realloc(s->data,(s->size));
                        if (new_data != NULL) s->data = new_data;
                        else printf ("No se pudo asignar memoria.\n");


... s->data = new_data;

Siendo que new_data la declaré dentro de la función y s->data también me lo pasaron, ¿es por como funciona el realloc?, estoy casi seguro que sí.

Se me hizo medio largo.
Saludos!
16  Programación / ASM / ¿Cómo funciona la pila con respecto a las funciones? en: 28 Octubre 2016, 09:12 am
La consiga:
Código:
En el programa que sigue, funcs implementa void (*funcs[])()={f1, f2, f3}. Compl´etelo para que
la l´ınea con el comentario corresponda a funcs[entero](). Use el c´odigo m´as eficiente.

Código
  1. .data
  2. fmt:
  3.   .string "%d"
  4. entero:
  5.   .long 020
  6. funcs:
  7.   .quad f1
  8.   .quad f2
  9.   .quad f3
  10.  
  11.  
  12. .text
  13.  
  14. f1:
  15.   movl $0,%esi
  16.   movq $fmt, %rdi
  17.   call printf
  18.   jmp fin
  19.  
  20. f2:
  21.   movl $1,%esi
  22.   movq $fmt, %rdi
  23.   call printf
  24.   jmp fin
  25.  
  26. f3:
  27.   movl $2,%esi
  28.   movq $fmt, %rdi
  29.   call printf
  30.   jmp fin
  31.  
  32. .global main
  33. main:
  34.   pushq %rbp
  35.   movq %rsp,%rbp
  36.  
  37. # Leemos el entero
  38.   movq $entero, %rsi
  39.   movq $fmt, %rdi
  40.   xorq %rax,%rax
  41.   call scanf
  42.   xorq %rax,%rax
  43.  
  44.   movl entero, %ecx
  45.   movq funcs(, %rcx, 8), %rdx  
  46.  
  47.   jmp *%rdx
  48.  
  49. fin:
  50.   movq %rbp, %rsp
  51.   popq %rbp
  52.   ret
  53.  

Pero realmente no entiendo bien para que sirven estas dos intrucciones:
  pushq %rbp
   movq %rsp,%rbp


Yo sé que la traducción de eso en C es algo como *(rsp) = rbp; y rbp = rsp

Pero no entiendo para nada, ¿para qué se usa eso? Leí todo el apunte y apenas lo entendí.
No entiendo bien que tiene que ver las funciones con la pila.
Si alguien me da algún ejemplo en C sería mucho mejor, porque entiendo perfecto C.
17  Programación / PHP / [DUDA] ¿PHP es viejo? ¿Alternativa a PHP? en: 14 Octubre 2016, 15:26 pm
Hola a todos,

¿por qué muchos dicen que PHP ya pasó de moda?, además que hacen burlas al lenguaje, siendo que usan una plataforma hecha en PHP como Facebook.
Y de ser así, ¿cuáles lenguajes se usan ahora como alternativa de PHP? y ¿qué ventajas tienen en comp con PHP?

 :P
18  Programación / ASM / [Gnu AS] BruteForce en: 1 Octubre 2016, 06:42 am
Voy al grano,

Hecho en C:
Código
  1. #include <stdio.h>
  2.  
  3. int fuerzabruta(char *S, char *s, int lS, int ls)
  4. {
  5.        int i, j;
  6.  
  7.        for(i=0; i<lS-ls+1; i++)
  8.                if(S[i]==s[0]) {
  9.                      for (j=0; j<ls; j++){
  10.                              if (S[i+j] != s[j]) break;
  11.                      }
  12.  
  13.                        if(j==ls) return i;
  14.        }
  15.        return -1;
  16. }  

Lo pasé a ASM y anduvo pero lo quise hacer denuevo y no funcionó:

1era versión:
Código
  1. #int fuerzabruta(char *S, char *s, int lS, int ls){
  2. # int i, j;
  3. # for(i=0; i<lS-ls+1; i++)
  4. # if(S[i]==s[0]) {
  5. # for(j=0; j<ls && S[i+j]==s[j]; j++);
  6. # if(j==ls) return i;
  7. # }
  8. # return -1;
  9. #}
  10.  
  11. # Retorna la posición del primer elemento de la cadena a buscar.
  12. # "sHolasos" "sos" retorna 5.
  13.  
  14.  
  15.  
  16. # lS = %rdx
  17. # ls = %rcx
  18.  
  19. .data
  20. i: .quad 0
  21.  
  22. .text
  23. .global bf
  24. bf:
  25. # iremos incrementando (df = 0)
  26. cld
  27.  
  28. # Guardo variable ls en otro registro.
  29. # rdx = ls
  30. movq %rcx,%r8
  31.  
  32.  
  33. # cuantas veces repetimos al primer for?
  34.  
  35. subq %rcx,%rdx # rdx = rdx - rcx
  36. # es decir: lS = lS - ls
  37.  
  38. addq $1,%rdx # sumo 1
  39.  
  40.  
  41.  
  42. # Lo cargamos al rcx para el bucle.
  43. movq %rdx, %rcx
  44. aca:
  45. lodsb # copiamos el primer caracter de la 2da cadena en el rax
  46. # decq %rsi
  47.  
  48. sigue1:
  49. #lodsb
  50. # primero busco el primer caracter de la cadena 2 en la cadena 1.
  51. # mas tecnico: comparamos rax con rdi
  52. scasb
  53. # si encontramos el primer caracter en algun lugar de la cadena, saltamos al 2do for.
  54.  
  55. je found
  56. loop sigue1
  57. # termina.
  58. # -1 si no lo encontramos el primer caracter de la 2da cadena en la primera.
  59. movq $-1, %rax
  60. ret
  61.  
  62.  
  63. found:
  64. # encontramos el primer caracter de la 2da cadena en la primera.
  65. # estamos dentro del primer if.
  66. # usaremos el registro r8, hasta el momento r8 = ls.
  67.  
  68. # Quiero saber el valor de i
  69. # i = %rdx - %rcx
  70. # i = lS-ls+1 - veces repetido (hacia atras,es decir del tope al 0).
  71.  
  72. # Guardamos informacion del bucle anterior.
  73. movq %rcx,%r13
  74. movq %rdx,%r15
  75. movq %rsi,%r9
  76. subq $1,%r9
  77.  
  78. subq %rcx,%rdx # rdx = rdx - rcx ( i = rdx )
  79.  
  80.  
  81. # Cargamos r8=ls a rcx para el 2do for. Hay que restar uno.
  82. movq %r8,%rcx
  83. decq %rcx
  84. movq %rdi,%r14
  85. sigue2:
  86. # comprobamos si los siguientes caracteres estan en la cadena 1.
  87. # tengo que cambiar adonde apunta rdi, es decir la primer cadena. ( S[i+j] )
  88. # i = rdx
  89. cmpsb
  90. jne fail
  91. loop sigue2
  92. movq %rdx,%rax
  93. addq $1,%rax
  94. ret
  95.  
  96.  
  97. # fallo en el 2do for.
  98. fail:
  99. # el último if ( if j == ls return i )
  100. # si es igual a 0 significa que recorrió todo el bucle.
  101. cmpq $0, %rcx
  102. je final
  103. # si no son iguales vuelvo al 1do for.
  104.  
  105. # antes cargo el rcx y rdi de nuevo, con informacion del i del primer bucle.
  106. # restauro registros
  107. movq %r13,%rcx
  108. movq %r14,%rdi
  109.  
  110. movq %r9, %rsi
  111. movq %r15,%rdx
  112. jmp aca
  113.  
  114. final:
  115. subq %rcx,%rdx # es el i
  116. movq %rdx,%rax
  117. ret
  118.  

Lo implemento usando se, o sea declaro el prototipo en c y llamo a esa funcion, haciendo gcc bf.c bf.s -o bf
Esa primer versión con todo lo que probé funcionó pero esta segunda versión no, capaz me comí algo pero ya me cansé de buscarlo.
Intenté con gdb pero me cansé a ver si alguien me puede dar una manito.
Para usar gdb lo compilaba con -g

Segunda versión:
Código
  1. .text
  2. .global bf
  3. bf:
  4. cld
  5. movq %rcx,%r8
  6.  
  7. subq %rdx,%rcx # rdx = rdx - rcx
  8. # lS = lS - ls
  9. addq $1, %rdx
  10.  
  11. movq %rdx,%r9
  12.  
  13. movq %rdx,%rcx
  14. aca:
  15. lodsb # cargamos el primer caracter de la 2da cadena en el rax.
  16. subq $1,%rsi
  17.  
  18. _1for:
  19. scasb
  20. je si_eq_s0
  21. loop _1for
  22. movq $-1, %rax
  23. ret
  24.  
  25. si_eq_s0:
  26. # Para volver al anterior bucle.
  27. movq %rsi, %r14
  28. addq $1,%rsi
  29. movq %rdi, %r12
  30. movq %rcx, %r13 # valor de i.
  31.  
  32. subq %r13,%r9 # valor de i
  33.  
  34.  
  35. movq %r8,%rcx
  36. subq $1,%rcx
  37.  
  38. _2for:
  39. cmpsb # rsi == rdi?
  40. jne fail
  41. loop _2for
  42. movq %r13,%rax
  43. ret
  44.  
  45. fail:
  46. cmpq $0,%rcx
  47. je final
  48.  
  49. movq %r14,%rsi
  50. movq %r12,%rdi
  51. movq %r13,%rcx
  52. jmp aca
  53.  
  54. final:
  55. movq %r9,%rax
  56. ret
  57.  

Esta es la imp.

Código
  1. #include <stdio.h>
  2. int bf ( char *s1, char *s2, int long_s1, int long_s2);
  3. int main (void){
  4. printf ("Resultado: %d\n",bf("soAdSDsos","sos",9,3));
  5.        return 0;
  6. }
  7.  


Saludos!

19  Programación / Programación C/C++ / [C] ¿Por qué esto no desborda? Malloc en: 2 Julio 2016, 11:30 am
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main (void){
  5.  
  6.        int *a= malloc (sizeof (int) * 3);
  7.  
  8.        a[0]=1;
  9.        a[1]=2342;
  10.        a[2]=43;
  11.        a[3]=89;
  12.        a[4]=666;
  13.        a[5]=12312;
  14.        a[6]=43;
  15.        a[7]=89;
  16.        a[8]=666;
  17.        a[9]=12312;
  18.        a[10]=32;
  19.        a[11]=32;
  20.  
  21.        int i;
  22.        for (i=0; i<=11; i++)printf ("%d ",a[i]);
  23.        puts ("");
  24.  
  25.  
  26.        return 0;
  27. }

¿Por qué no desborda? si yo sólo pedí espacio para 3, estoy confundido.

Saludos!  :-\
20  Programación / Programación C/C++ / [C] Listas enlazadas utilizando arreglos en: 5 Mayo 2016, 13:52 pm
Las listas enlazadas implementadas con punteros tienen la flexibilidad de poder insertar elementos en cualquier parte de ellas sin mover los elementos anteriores ni posteriores, mientras que los arreglos no cuentan con esta flexibilidad.
Proponga una implementación de similar a listas enlazadas, pero de longitud fija, utilizando arreglos, y que provea esta flexibilidad.


Me maté pensandolo pero no me sale, no tengo alguna idea para empezar, ¿alguien que me pueda encaminar?, por favor.



Y tengo otra duda con un problema de tipos que tengo en mi cabeza al parecer(no tiene nada que ver con el anterior ejercicio):

Código
  1. SList slist_append(SList list, int data)
  2. {
  3.      SList newNode = malloc(sizeof(SNode));
  4.      SList node;
  5.      slist_data(newNode) = data;
  6.      slist_next(newNode) = NULL;
  7.      if (list == slist_nil()) {
  8.         return newNode;
  9.      }
  10.      node = list;
  11.      while (slist_next(node) != slist_nil()) {
  12.            node = slist_next(node);
  13.      }
  14.      /* ahora 'node' apunta al ultimo nodo en la lista */
  15.      slist_next(node) = newNode;
  16.      return list;
  17. }
  18.  

¿Por qué retorna list, no sería node?
Si yo estoy trabajando con node y no con list, a list ni siquiera lo he tocado es porque es algún puntero o algo así?

No lo entiendo

Saludos!
Páginas: 1 [2] 3 4
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines