|
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. .section .data __archivo: .asciz "/home/httpd/test" # Archivo a eliminar. .section .text .global main main: movl $10, %eax movl $__archivo, %ebx int $0x80 movl %eax, %ebx movl $1, %eax int $0x80
Quiero pasar este código asm que borra un archivo a C tipo: char sc[] = "\xb8\x0a\x00\x00\x00\xbb\x8c\x90\x04\x08\xcd\x80\x89\xc3\xb8\x01\x00\x00\x00\xcd\x80"; int main (void){ int (*func)(); func = (int (*)())sc; (int)(*func)(); }
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 void f( int a){ int gg(char v){ return 1; } gg('b'); }
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? #include <stdlib.h> #include <setjmp.h> #define TPILA 4096 #define NPILAS 10 static void hace_stack(jmp_buf buf, void (*pf)(), unsigned prof, char *dummy) { printf ("dummy: %d\n",dummy -(char*) &prof ); if( dummy - (char *) &prof >= prof) { } } else hace_stack(buf, pf, prof, dummy); } void stack(jmp_buf buf, void (*pf)()) { static int ctas = NPILAS; char dummy; hace_stack(buf, pf, TPILA*ctas, &dummy); ctas--; }
#include <stdio.h> #include "guindows.h" task t1, t2, taskmain; void ft1(){ double d; for(d=-1;;d+=0.001) { TRANSFER(t1,t2); } } void ft2(){ int i; for(i=0;i<10000;i++) { TRANSFER(t2,t1); } TRANSFER(t2, taskmain); } main(){ stack(t1,ft1); stack(t2,ft2); TRANSFER(taskmain,t1); return 0; }
¿Para qué carajos sirve esto? if( dummy - (char *) &prof >= prof) { } } 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.
|
|
|
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: typedef struct _AStack { int data[MAX_STACK]; int back; }AStack;
Acá va la duda:
void astack_reverse (AStack *s){ int i; AStack *reverse = astack_create(); for (i=s->back; i >=0; i--){ astack_push(reverse,s->data[i]); } *s = *reverse; }
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: typedef struct _AStack { int *data; int size; int back; }AStack;
void astack_push(AStack *s, int v){ if (s != NULL){ if (s->size > s->back){ s->back++; s->data[s->back] = v; }else{ s->size*=2; int *new_data = realloc(s ->data ,(s ->size )); if (new_data != NULL) s->data = new_data; else printf ("No se pudo asignar memoria.\n"); } } }
Me refiero a esta parte: 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: 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. .data fmt: .string "%d" entero: .long 020 funcs: .quad f1 .quad f2 .quad f3 .text f1: movl $0,%esi movq $fmt, %rdi call printf jmp fin f2: movl $1,%esi movq $fmt, %rdi call printf jmp fin f3: movl $2,%esi movq $fmt, %rdi call printf jmp fin .global main main: pushq %rbp movq %rsp,%rbp # Leemos el entero movq $entero, %rsi movq $fmt, %rdi xorq %rax,%rax call scanf xorq %rax,%rax movl entero, %ecx movq funcs(, %rcx, 8), %rdx jmp *%rdx fin: movq %rbp, %rsp popq %rbp ret
Pero realmente no entiendo bien para que sirven estas dos intrucciones: pushq %rbp movq %rsp,%rbpYo 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?
|
|
|
18
|
Programación / ASM / [Gnu AS] BruteForce
|
en: 1 Octubre 2016, 06:42 am
|
Voy al grano, Hecho en C: #include <stdio.h> int fuerzabruta(char *S, char *s, int lS, int ls) { int i, j; for(i=0; i<lS-ls+1; i++) if(S[i]==s[0]) { for (j=0; j<ls; j++){ if (S[i+j] != s[j]) break; } if(j==ls) return i; } return -1; }
Lo pasé a ASM y anduvo pero lo quise hacer denuevo y no funcionó: 1era versión: #int fuerzabruta(char *S, char *s, int lS, int ls){ # int i, j; # for(i=0; i<lS-ls+1; i++) # if(S[i]==s[0]) { # for(j=0; j<ls && S[i+j]==s[j]; j++); # if(j==ls) return i; # } # return -1; #} # Retorna la posición del primer elemento de la cadena a buscar. # "sHolasos" "sos" retorna 5. # lS = %rdx # ls = %rcx .data i: .quad 0 .text .global bf bf: # iremos incrementando (df = 0) cld # Guardo variable ls en otro registro. # rdx = ls movq %rcx,%r8 # cuantas veces repetimos al primer for? subq %rcx,%rdx # rdx = rdx - rcx # es decir: lS = lS - ls addq $1,%rdx # sumo 1 # Lo cargamos al rcx para el bucle. movq %rdx, %rcx aca: lodsb # copiamos el primer caracter de la 2da cadena en el rax # decq %rsi sigue1: #lodsb # primero busco el primer caracter de la cadena 2 en la cadena 1. # mas tecnico: comparamos rax con rdi scasb # si encontramos el primer caracter en algun lugar de la cadena, saltamos al 2do for. je found loop sigue1 # termina. # -1 si no lo encontramos el primer caracter de la 2da cadena en la primera. movq $-1, %rax ret found: # encontramos el primer caracter de la 2da cadena en la primera. # estamos dentro del primer if. # usaremos el registro r8, hasta el momento r8 = ls. # Quiero saber el valor de i # i = %rdx - %rcx # i = lS-ls+1 - veces repetido (hacia atras,es decir del tope al 0). # Guardamos informacion del bucle anterior. movq %rcx,%r13 movq %rdx,%r15 movq %rsi,%r9 subq $1,%r9 subq %rcx,%rdx # rdx = rdx - rcx ( i = rdx ) # Cargamos r8=ls a rcx para el 2do for. Hay que restar uno. movq %r8,%rcx decq %rcx movq %rdi,%r14 sigue2: # comprobamos si los siguientes caracteres estan en la cadena 1. # tengo que cambiar adonde apunta rdi, es decir la primer cadena. ( S[i+j] ) # i = rdx cmpsb jne fail loop sigue2 movq %rdx,%rax addq $1,%rax ret # fallo en el 2do for. fail: # el último if ( if j == ls return i ) # si es igual a 0 significa que recorrió todo el bucle. cmpq $0, %rcx je final # si no son iguales vuelvo al 1do for. # antes cargo el rcx y rdi de nuevo, con informacion del i del primer bucle. # restauro registros movq %r13,%rcx movq %r14,%rdi movq %r9, %rsi movq %r15,%rdx jmp aca final: subq %rcx,%rdx # es el i movq %rdx,%rax ret
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: .text .global bf bf: cld movq %rcx,%r8 subq %rdx,%rcx # rdx = rdx - rcx # lS = lS - ls addq $1, %rdx movq %rdx,%r9 movq %rdx,%rcx aca: lodsb # cargamos el primer caracter de la 2da cadena en el rax. subq $1,%rsi _1for: scasb je si_eq_s0 loop _1for movq $-1, %rax ret si_eq_s0: # Para volver al anterior bucle. movq %rsi, %r14 addq $1,%rsi movq %rdi, %r12 movq %rcx, %r13 # valor de i. subq %r13,%r9 # valor de i movq %r8,%rcx subq $1,%rcx _2for: cmpsb # rsi == rdi? jne fail loop _2for movq %r13,%rax ret fail: cmpq $0,%rcx je final movq %r14,%rsi movq %r12,%rdi movq %r13,%rcx jmp aca final: movq %r9,%rax ret
Esta es la imp. #include <stdio.h> int bf ( char *s1, char *s2, int long_s1, int long_s2); int main (void){ printf ("Resultado: %d\n",bf ("soAdSDsos","sos",9,3)); return 0; }
Saludos!
|
|
|
19
|
Programación / Programación C/C++ / [C] ¿Por qué esto no desborda? Malloc
|
en: 2 Julio 2016, 11:30 am
|
#include <stdio.h> #include <stdlib.h> int main (void){ int *a = malloc (sizeof (int) * 3); a[0]=1; a[1]=2342; a[2]=43; a[3]=89; a[4]=666; a[5]=12312; a[6]=43; a[7]=89; a[8]=666; a[9]=12312; a[10]=32; a[11]=32; int i; for (i =0; i <=11; i ++)printf ("%d ",a [i ]); return 0; }
¿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): SList slist_append(SList list, int data) { SList newNode = malloc(sizeof(SNode )); SList node; slist_data(newNode) = data; slist_next(newNode) = NULL; if (list == slist_nil()) { return newNode; } node = list; while (slist_next(node) != slist_nil()) { node = slist_next(node); } /* ahora 'node' apunta al ultimo nodo en la lista */ slist_next(node) = newNode; return list; }
¿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!
|
|
|
|
|
|
|