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

 

 


Tema destacado: Estamos en la red social de Mastodon


  Mostrar Mensajes
Páginas: 1 [2] 3
11  Programación / Ingeniería Inversa / Parchear ejecutable y direcciones de memoria en: 25 Junio 2019, 15:47 pm
Estoy teniendo el siguiente problema:

Digamos que abro un ejecutable con un debugger y agrego el siguiente codigo:

Código:
push rbp
mov rbp, rsp
push r9
push r8
push rdx
push rcx
sub rsp, 20
mov r9, 0
mov r8, 0x0000F7855219251      ; en esta direccion hay una cadena
mov rdx, 0x0000F7855219251    ; ^
mov rcx, 0
call user32.MessageBoxA
add rsp, 20
pop rcx
pop rdx
pop r8
pop r9
pop rbp

Funciona perfecto y sin problemas, pero a la hora de parchear el ejecutable y ejecutarlo de nuevo, las direcciones quedan obsoletas.

Es decir, la cadena ya no esta en 0x0000F7855219251 si no que se cargo en otra direccion diferente, lo mismo pasa con la direccion de user32.MessageBoxA.
Esto por supuesto produce que el programa crashee.

Para destacar: La cadena se carga en una direccion diferente, pero es la misma direccion relativa al codigo. Es decir, esta siempre a 55 bytes desde el inicio del codigo.
Lo mismo con la funcion MessageBoxA, pero la libreria user32 se carga en una direccion diferente.

Como puedo resolver este problema?

Gracias
12  Programación / Programación C/C++ / Re: Duda adivinar numero sin fallar en: 25 Junio 2019, 15:40 pm
Si el usuario obtiene la direccion de memoria donde se esta almacenando la variable "dato", tendra el numero aleatorio exacto que se genero.

O si el usuario modifica la funcion rand() para que devuelva siempre el mismo valor (parcheando el binario).

Si a lo que te referis es si el programa es "seguro" (refiriendome a que el numero aleatorio sea realmente aleatorio) tampoco es tan asi...

Es posible predecir el resultado de rand() porque estas usando el timestamp actual como semilla.
13  Programación / Programación C/C++ / Re: Programa miniwin en: 24 Junio 2019, 19:06 pm
Desconozco la API a la que te refieres, pero basicamente lo que debes hacer es lo siguiente:

Mostrar una ventana de 600x600 pixeles.

Pintar el cielo, de color azul, que tendria 600 pixeles de ancho y 400 de alto, y su posicion relativa a la ventana seria 0, 0.

Pintar el suelo, que tendria 600 pixeles de ancho y 200 de alto, y su posicion relativa a la ventana en 0, 400.

Deberas crear una arreglo de enteros que representara el ambiente (todos los rectangulos en la pantalla). Este deberia tener un tama;o fijo de 30:

Código:
int ambiente[30];


Cada elemento del arreglo representara a un rectangulo, cuyo valor sera la altura de este.

Debera ser inicializado con valores al azar entre 100 y 250, como dice la consigna.

Para simular el movimiento del ambiente, simplemente desplazar todos los valores de los elementos del arreglo hacia la izquierda, y asignarle un valor aleatorio entre 100 y 250 al ultimo elemento.

Algo como esto:

Código:

// recorremos desde el elemento 0 al elemento 28 (el anteultimo) y le asignamos el valor del elemento siguiente.

// saltamos el ultimo
for(int i=0; i<29; i++) {
      ambiente[i] = ambiente[i + 1];
}

// le asingamos un valor al azar al ultimo elemento
ambiente[29] = rand()%(250-100 + 1) + 100;

Para pintar los rectangulos es simple. Sabemos que el ambiente ocupa todo el ancho de la pantalla y en el caben 30 rectangulos. El ancho de cada rectangulo es 600 / 30 = 20 pixeles.
El alto del rectangulo es su valor correspondiente en la matriz (ambiente donde i es el numero del rectangulo que estamos pintando).

La posicion X del rectangulo sera el numero del rectangulo multiplicado por el ancho (20), y la posicion Y seria la diferencia entre la altura del cielo (400px) y la altura del rectangulo (ambiente).


Espero me hayas entendido y lo puedas implementar.
 
Saludos
14  Programación / Programación C/C++ / Re: duda visual studio en: 21 Junio 2019, 04:23 am
Claro que si:

https://visualstudio.microsoft.com/es/vs/support/vs2015/can-change-visual-studio-installing/?rr=https%3A%2F%2Fduckduckgo.com%2F

Aunque tu pregunta no tiene nada que ver con C/C++, googlear un poco no hace mal  ;D

Saludos
15  Programación / Programación C/C++ / Re: error en poo cuando compilo en: 20 Junio 2019, 07:09 am
cuando compilo este code
Código:
#include<iostream>
#include<stdlib.h>
using namespace std;

class Persona{
    private:
        int edad;
        string nombre;
    public:
        Persona(int, string);
        void leer();
        void corre();
};
//constructor nos sirve para inicializar los atributos de la clase
Persona::Persona(int _edad, string _nombre){
    edad=_edad;
    nombre=_nombre;
}

void Persona::leer(){
    cout<<"soy"<<nombre<<"y estoy leendo"<<endl;
}
void Persona::corre(){
     cout<<"soy"<<nombre<<"y estoy corriendo"<<endl;
}
int main(){
    Persona p1=perror(20,"alejandro");  ->>> aca es donde me sale el error linea 27

 p1.leer();

 system("pause");
 return 0;
}


||=== Build: Debug in app (compiler: GNU GCC Compiler) ===|
||In function 'int main()':|
|27|error: invalid conversion from 'int' to 'const char*' [-fpermissive]|
|27|error: too many arguments to function 'void perror(const char*)'|
|481|note: declared here|
27|error: conversion from 'void' to non-scalar type 'Persona' requested|
||=== Build failed: 3 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|



me sale estos tipos de errores en  Persona p1=perror(20,"alejandro");

Tenes un error de tipeo. Parece que intentabas escribir "Persona" y el IDE que estas usando lo autocompleto a "perror."

Por otro lado, no hace falta la asignacion, basta con pasar los parametros al constructor de la clase al inicializarla:

Código:
Persona p1(20, "alejandro");

A menos que quieras almacenarlo en la heap, en ese caso si es necesario asignarle la direccion de memoria de la nueva instancia a el puntero:

Código:
Persona *p1 = new Persona(20, "alejandro");
p1->leer();
16  Programación / Ingeniería Inversa / Re: Encontrar funcion que me interesa en: 18 Junio 2019, 01:54 am
En realidad lo de desviarla lo puse a modo de ejemplo, lo que me interesa es hookear la funcion.
Por eso necesito localizarla.

Probe buscando la URL en la memoria (suponiendo que la funcion que envia la peticion accede directamente a esta direccion para formular la consulta HTTP) pero no pude encontrar nada, hay decenas de direcciones con el mismo valor.

No conocia ese debugger, lo voy a probar a ver que tal. Parece sencillo, gracias.
17  Programación / PHP / Re: [Pregunta]: Pasar dato de variable (JS) a una variable PHP en: 17 Junio 2019, 16:50 pm
Para poder asesorarte mejor, que representaria esta variable y porque necesitas recibirla en PHP?

18  Programación / Ingeniería Inversa / Encontrar funcion que me interesa en: 17 Junio 2019, 00:33 am
Buenas.

Soy bastante nuevo en el tema de la ingenieria inversa y tengo el siguiente problema:

Tengo un programa que realiza una peticion HTTP a un servidor al presionar un boton.
Lo que quiero lograr es conseguir la direccion de esta funcion para hookearla con un detour y poder interceptar esta peticion HTTP para modificarla/logearla/cancelarla/desviarla/etc (solo con fines de aprendizaje :rolleyes:).

El problema es que no logro encontrar cual es la funcion que esta enviando la peticion.

Estoy usando Cheat Engine para debuggear el programa, por la unica razon de que ya me acostumbre a utilizarlo. Asumo que cualquier otro debugger tendra las mismas capacidades.

Que es lo que intente y no funciono?

  • Setear un breakpoint en WS2_32.send() y mirar la stacktrace para ver que funcion esta llamando a send(), que deberia ser la funcion que prepara la consulta HTTP. No funciono, el programa nunca se detiene ahi. Como sea que se este enviando no utiliza esta libreria.
  • Coneguir el address del buffer donde se guarda el input del usuario (que se incluye en el body de la peticion HTTP) y fijarme que instrucciones acceden a esta direccion, suponiendo que la funcion que prepara la peticion lee el input desde ahi. No funciono, todas las instrucciones que acceden a esta direccion no tienen nada que ver con la consulta. Al parecer, este buffer se guarda en algun tipo de estructura y la funcion que envia la peticion HTTP no accede directamente a este buffer si no a la estructura.
  • Revisar las librerias que carga el ejecutable para ver si hay alguna relacionada al protocolo HTTP que pudiese ser usada para enviar la consulta (al estilo WinHTTP). No funciono, no encontre ninguna libreria que me haga ruido.
  • Buscar parte de la consulta HTTP en la memoria, ejemplo "GET /foobar" y fijarme que accede a esta direccion (que deberia ser alguna funcion que prepara la consulta y otra que la envia). No funciono, cada consulta tiene su propio buffer aparte, por lo tanto cuando me pongo a "escuchar" que instrucciones acceden a esa direccion ninguna lo hace, puesto que ya lo hicieron al enviar la consulta y las futuras consultas tienen su propio buffer.

Estoy procediendo de manera correcta?
Que harian ustedes para localizar la funcion?

Siempre utilice estos procedimientos para encontrar funciones en otros programas y tuve exito, pero esta vez se me esta complicando.

Desde ya gracias por su ayuda.
19  Programación / Programación C/C++ / Re: Problema con arreglo dinamico de estructura en: 15 Junio 2019, 04:42 am
Tengo que hacer un programa en el cual recibo por funcion un arreglo estatico de estructura y una letra.
Luego, tengo que crear un arreglo dinamico de estructura en el cual tengo que guardar los datos del arreglo estatico en el cual el codigo que tenga sea igual al pasado por parametro.
Luego, tengo que guardarlo en orden ascendente e imprimirlo por pantalla.
El problema es que en un momento del programa, creo que el problema esta en el while que esta entre la linea 51 y 64.

Tal como dice el compañero, tu programa esta crasheando en strcpy() porque "nombre" es un "wild pointer" (puntero no inicializado, solo dios sabe hacia que region de la memoria apunta y que hay ahi).

Debes, o bien reemplazar el puntero por un array de tipo char con un tamano definido, o reservar memoria para almacenar el nombre en ese puntero en la heap utilizando malloc(), calloc() o realloc().

Te recomiendo que compiles tus programas con simbolos de depuracion (opcion -g en gcc) y utilices algun debugger para localizar este tipo de problemas.

Te vas a ahorrar mucho tiempo tratando de encontrar el problema en el codigo y con el debugger vas a localizar el problema al instante.

Por otra parte, no deberias usar strcpy().
Esta funcion copia la cadena de origen en la cadena de destino sin tener en cuenta el espacio disponible en el destino.

Si la cadena de origen es mas grande que el tama;o del buffer, este se desbordaria, lo cual podria corromper la memoria o ser manipulado intencionalmente para cambiar el flujo del programa.

Utiliza en su defecto strncpy() o memcpy().

La diferencia de estas dos funciones es que aceptan como parametro el tama;o del buffer y solo copian "lo que entre", de esta manera se evita el desborde.

Código:
arreglo[2].nombre="Pablo";

Haciendo esto el puntero "nombre" apunta hacia la cadena constante "Pablo".
Si haces eso tene en cuenta que no vas a poder modificar la cadena a la que apunta "nombre" ya que es una constante.


20  Programación / Programación C/C++ / Re: Obtener Int de un EDIT y otros problemas. Windows Api. en: 14 Junio 2019, 02:26 am
Son varios problemas y buscaba recomendaciones. Quise ponerlos todos en el mismo hilo e intenté ser claro. Principalmente son 2 problemas que describo en 6 lineas al principio.
El resto se puede ignorar, solo aporto más detalles y comento dudas por si alguien lee y me hace recomendaciones sobre el código.

Te tomo el consejo, intentaré ser más claro y concretar más en futuras intervenciones.
No quería hacer un hilo por problema, otro para pedir recomendaciones sobre el código, etc.
Intenté integrarlo todo en único hilo.

Ya voy mirando por la api y ejemplos, si no, no tendría nada hecho.

Ya solucione uno de los principales 2 problemas. Por suerte resolví el problema de mostrar el texto en un EDIT. Y tu me ofreciste una respuesta para el otro problema con el cual me pondré ahora a resolver.

Muchas gracias.









TEMA APARTE:

Pondré el código que resuelve el problema de mostrar un string en un EDIT por si alguiem se encuentra el mismo problema:
Código
  1. wstring stemp = wstring(Texto_Cifrado.begin(), Texto_Cifrado.end();
  2. LPCWSTR cifrado =stemp.c_str();
  3. SetWindowTextW(hwndEdit2, cifrado);

Para que funcione hay que cambiar las declaraciones de variables y las funciones de
string mivariable; a
wstring mivariable;


Si la documentacion de MSDN se te hace un poco escasa o dificil de entender, te dejo el siguiente curso de WINAPI que esta en castellano y muy bien explicado.

El curso esta algo viejito pero no obsoleto y seguramente te va a ser de mucha ayuda.

http://winapi.conclase.net/

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