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

 

 


Tema destacado:


  Mostrar Mensajes
Páginas: 1 2 3 [4] 5 6 7 8 9 10 11 12 13
31  Programación / Programación General / Re: ¿Desafios de Programacion? en: 26 Mayo 2013, 14:21 pm
projecteuler.net la conocia, las otras 2 de s00rk no.

Yo os recomiendo que intenteis resolver los problemas de Code Jam.
http://code.google.com/codejam/
32  Programación / Programación General / Re: Con cual Empezar a programar(principiante) en: 26 Mayo 2013, 14:18 pm
Aprende C++, sirve para todo y es eficiente.
Además es multiplataforma, VB no lo es.
33  Foros Generales / Foro Libre / Re: ¿El alma existe? ¿qué es el alma? en: 2 Enero 2013, 00:09 am
Yo no lo sé.
34  Programación / ASM / Re: Shellcode no imprime caracter(64 bits) en: 10 Noviembre 2012, 17:37 pm
Bueno, resulta que también pregunté en stackoverflow y al final me contesto a mi mismo.
Podeis ver la respuesta en este hilo: http://stackoverflow.com/questions/13323379/shell-code-print-character64bits
35  Programación / ASM / Shellcode no imprime caracter(64 bits) en: 10 Noviembre 2012, 04:37 am
Hola, estaba haciendo una shellcode de prueba. Simplemente debe de imprimir el carácter 'w'.
He usado el gdb para comprobar todas la instrucciones y el programa acaba correctamente pero no se por que no imprime el carácter.

Código
  1. #include <stdio.h>
  2. #include <sys/mman.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. int (*sc)();
  7. /****************************************************************
  8. 0000000000000000 <main>:                                         /
  9.   0: 48 31 c9             xor    %rcx,%rcx                  /
  10.   3: 48 31 c0             xor    %rax,%rax                  /
  11.   6: eb 11                 jmp    19 <n>                     /
  12.                                                                  /
  13. 0000000000000008 <et>:                                            /
  14.   8: 59                   pop    %rcx                       /
  15.   9: b0 04                 mov    $0x4,%al                   /
  16.   b: b3 01                 mov    $0x1,%bl                   /
  17.   d: b2 01                 mov    $0x1,%dl                   /
  18.   f: cd 80                 int    $0x80                      /
  19.  11: 48 31 c0             xor    %rax,%rax                  /
  20.  14: 48 ff c0             inc    %rax                       /
  21.  17: cd 80                 int    $0x80                      /
  22.                                                                  /
  23. 0000000000000019 <n>:                                             /
  24.  19: e8 ea ff ff ff       callq  8 <et>                     /
  25.                                                                  /
  26. 000000000000001e <abc>:                                           /
  27. ...                                                           /
  28. ******************************************************************/
  29.  
  30.  
  31.  
  32. char shellcode[] = "\x48\x31\xc9\x48\x31\xc0\xeb\x11\x59\xb0\x04\xb3\x01\xb2\x01\xcd\x80\x48\x31\xc0\x48\xff\xc0\xcd\x80\xe8\xea\xff\xff\xffw";
  33.  
  34. int main(int argc, char **argv) {
  35.  
  36.    char *ptr = mmap(0, sizeof(shellcode),
  37.            PROT_EXEC | PROT_WRITE | PROT_READ, MAP_ANON
  38.            | MAP_PRIVATE, -1, 0);
  39.  
  40.    if (ptr == MAP_FAILED) {
  41.        perror("mmap");
  42.        exit(-1);
  43.    }
  44.  
  45.    memcpy(ptr, shellcode, sizeof(shellcode));
  46.    sc = ptr;
  47.  
  48.    (void)((void(*)())ptr)();
  49.  
  50.    return 0;
  51. }

EI: juntando mensajes.

He corregido algunos posibles errores. Pero sigue sin funcionar.
Tengo que decir que que el código ensamblador(en nasm) funciona pero la shellcode insertada en c no funciona.
Lo que he hecho es añadir los xor por si quedaba basura en los registros y cambiar la llamada a exit() por un ret para que después de la función continúe.

Código
  1. #include <stdio.h>
  2. #include <sys/mman.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. int (*sc)();
  7. /****************************************************************
  8. 0000000000000000 <main>:                                      /
  9.   0: 48 31 c9             xor    %rcx,%rcx              /
  10.   3: 48 31 c0             xor    %rax,%rax              /
  11.   6: eb 13                 jmp    1b <n>                 /
  12.                                                                   /
  13. 0000000000000008 <et>:                                        /
  14.   8: 59                   pop    %rcx                   /
  15.   9: 48 31 c0             xor    %rax,%rax              /
  16.   c: 48 31 db             xor    %rbx,%rbx              /
  17.   f: 48 31 d2             xor    %rdx,%rdx              /
  18.  12: b0 04                 mov    $0x4,%al               /
  19.  14: b3 01                 mov    $0x1,%bl               /
  20.  16: b2 01                 mov    $0x1,%dl               /
  21.  18: cd 80                 int    $0x80                  /
  22.  1a: c3                   retq                          /
  23.                                                              /
  24. 000000000000001b <n>:                                         /
  25.  1b: e8 e8 ff ff ff       callq  8 <et>                 /
  26.                                                              /
  27. 0000000000000020 <abc>:                                       /
  28.  20: 77                   .byte 0x77                    /
  29. ...                                                       /
  30. ******************************************************************/
  31.  
  32.  
  33.  
  34. char shellcode[] = "\x48\x31\xc9\x48\x31\xc0\xeb\x13\x59\x48\x31\xc0\x48\x31\xdb\x48\x31\xd2\xb0\x04\xb3\x01\xb2\x01\xcd\x80\xc3\xe8\xe8\xff\xff\xffw";
  35. //char shellcode[] = "\x48\x31\xc9\x48\x31\xc0\xeb\x11\x59\xb0\x04\xb3\x01\xb2\x01\xcd\x80\x48\x31\xc0\x48\xff\xc0\xcd\x80\xe8\xea\xff\xff\xffw";
  36.  
  37. int main(int argc, char **argv) {
  38.  
  39.    char *ptr = mmap(0, sizeof(shellcode),
  40.            PROT_EXEC | PROT_WRITE | PROT_READ, MAP_ANON
  41.            | MAP_PRIVATE, -1, 0);
  42.  
  43.    if (ptr == MAP_FAILED) {
  44.        perror("mmap");
  45.        exit(-1);
  46.    }
  47.  
  48.    memcpy(ptr, shellcode, sizeof(shellcode));
  49.    sc = ptr;
  50.  
  51.    (void)((void(*)())ptr)();
  52.    printf("\n");
  53.  
  54.    return 0;
  55. }

El código de nasm es el siguiente:
Código
  1. ;EXAMPLE VARIABLES IN LINUX
  2.  
  3.  
  4. global main
  5.  
  6. main:                           ; main
  7.  
  8. xor rcx, rcx            ; eficient way turning register to 0
  9. xor rax, rax            ; exclusive or
  10.  
  11. jmp n            
  12. et:
  13. pop rcx
  14.  
  15. xor rax, rax
  16. xor rbx, rbx
  17. xor rdx, rdx
  18. mov al, 4                      ; Number of system call (write)
  19. mov bl, 1                      ; argument(1=stdout)
  20. mov dl, 1                      ; number of characters
  21. int 0x80
  22.  
  23. ret
  24.  
  25. n:
  26. call et
  27. abc: db 'w'            ; declaring one variable(size 8 bytes)

EI: juntando mensajes.

Bueno, resulta que también pregunté en stackoverflow y al final me contesto a mi mismo.
Podeis ver la respuesta en este hilo: http://stackoverflow.com/questions/13323379/shell-code-print-character64bits
36  Programación / Programación C/C++ / Re: El programa se cierra al usar string[] en: 3 Noviembre 2012, 23:32 pm
Claro que si hombre, tiene que ser difícil. xD
Pues no se, a mi si que me funciona con "1212".
A lo mejor es que el código que he puesto no es el que me quedó al final.
A ver si es este:
Código
  1. #include <iostream>
  2. #include <cmath>
  3. #include <string.h>
  4.  
  5. using namespace std;
  6.  
  7. string* _sqrt(string num);
  8. string* chunk_split(string source, int length = 2);
  9. string substr(string source, int start, int end);
  10. int chrpos(char s, char *str);
  11.  
  12. int main(){
  13. string s;
  14.  
  15. cout << "Insert a number:\n> ";
  16. cin >> s;
  17.  
  18. _sqrt(s);
  19.  
  20. //cin.get();
  21. cin.get();
  22. return 0;
  23. }
  24.  
  25. int chrpos(char s, char *str){
  26. for(int i=0,c=(int)strlen(str);i<c;i++){
  27. if(str[i] == s) return i;
  28. }
  29. return -1;
  30. }
  31.  
  32. string* chunk_split(string source, int length){
  33. int j = 0, t = (int)ceil((int)source.length()/2);
  34. string* r= new string[t+1]; //remember to delete
  35. for(int i=0;i<source.length();i+=length){
  36. r[j] = substr(source, i, ((source.length()-i==1)?(i+length-2):(i+length-1)));
  37. ++j;
  38. }
  39. return r;
  40. }
  41.  
  42. string substr(string source, int start, int end){
  43. string r = "";
  44. for(int i=start,c=end;i<=c;i++){
  45. r += source[i];
  46. }
  47. return r;
  48. }
  49.  
  50. string* _sqrt(string num){
  51. const int l = (int)ceil((int)num.length()/2);
  52. string* arr = chunk_split(substr(num, 0, num.length()-1 ), 2);
  53. for(int i=0;i<l+1;i++){
  54. cout << "arr[" << i << "] = " << arr[i] << endl;
  55. }
  56.  
  57. // cout << substr(num, 4, 4);
  58. return arr;
  59. }

De todos modos revisaré el código.
37  Programación / Programación C/C++ / Re: El programa se cierra al usar string[] en: 3 Noviembre 2012, 01:44 am
(int)ceil((int)num.length()/2)
En este segmento de código lo que pasa es que si por ejemplo num.length() es 7 -> num.length()/2=3.5-->(int)num.length()/2=3 -->ceil(3.0)==3

No quería decir que eso sea para el colegio, sino que ese método de hacer raíces manualmente se suele enseñar en el colegio(al menos a mi me lo enseñaron en el cole).

Citar
Y para practicar me puse la condición de nada de sqrt(), pero eso se soluciona fácil creando una función sqrt2() creada por mi, como el método babilónico que me has dejado.
¿ Podrías explicar esta frase? Es que no la entiendo. xD

Sobre lo de que te da segmentation fault... ¿Podrías decirme para que numero lo has probado? Es que con los números que yo he introducido no me da ese error.
38  Programación / Programación C/C++ / Re: El programa se cierra al usar string[] en: 2 Noviembre 2012, 03:30 am
Un problema es la asignación de strings:
Código
  1. string arr[1024] = chunk_split(substr(num, 1, num.length() - 3), 2);
Con esto lo que haces es meter en todos los elementos de el array lo mismo.

Con este ejemplo se ve claro:

Código
  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<string.h>
  4. #include<cmath>
  5. using namespace std;
  6.  
  7. int main(){
  8. string hole[5]="hole";
  9. hole[1]="hole";
  10. cout<<hole[3]<<endl;
  11. }
Esto imprime "hole"

Otro problema es que pretendes devolver muchas strings pero el tipo de retorno es string(solo una). Para ello se deben usar arrays de string.

Otro problema es que en el ceil haces casting a int dentro primero y así redondeas al más bajo cuando ceil se supone que debe redondear al más alto. Pero de todas maneras esto se puede solucionar sumando 1.

He modificado un poco tu código:
Código
  1. #include <iostream>
  2. #include <cmath>
  3. #include <string.h>
  4.  
  5. using namespace std;
  6.  
  7. string* _sqrt(string num);
  8. string* chunk_split(string source, int length = 2);
  9. string substr(string source, int start, int end);
  10. int chrpos(char s, char *str);
  11.  
  12. int main(){
  13. string s;
  14.  
  15. cout << "Insert a number:\n> ";
  16. cin >> s;
  17.  
  18. _sqrt(s);
  19.  
  20. //cin.get();
  21. cin.get();
  22. return 0;
  23. }
  24.  
  25. int chrpos(char s, char *str){
  26. for(int i=0,c=(int)strlen(str);i<c;i++){
  27. if(str[i] == s) return i;
  28. }
  29. return -1;
  30. }
  31.  
  32. string* chunk_split(string source, int length){
  33. int j = 0, t = (int)ceil((int)source.length()/2);
  34. string* r= new string[t+1]; //remember to delete
  35. for(int i=0;i<source.length();i+=length){
  36. r[j] = substr(source, i, ((source.length()-i==1)?(i+length-2):(i+length-1)));
  37. ++j;
  38. }
  39. return r;
  40. }
  41.  
  42. string substr(string source, int start, int end){
  43. string r = "";
  44. for(int i=start,c=end;i<=c;i++){
  45. r += source[i];
  46. }
  47. return r;
  48. }
  49.  
  50. string* _sqrt(string num){
  51. const int l = (int)ceil((int)num.length()/2);
  52. string* arr = chunk_split(substr(num, 0, num.length()-1 ), 2);
  53. for(int i=0;i<l+1;i++){
  54. cout << "arr[" << i << "] = " << arr[i] << endl;
  55. }
  56.  
  57. // cout << substr(num, 4, 4);
  58. return arr;
  59. }

Ah, y un error que me ha sorprendido por que daba segmentation fault es que la función _sqrt() no devuelve nada.

Supongo que quieres hacer la raíz cuadrada por el método manual que se enseña en el colegio. Me parece una gran idea. Si tienes más problemas puedes escribir aquí, estaré encantado de ayudarte.
Por si te interesa hay otros métodos de hacer raíces que se suelen usar en computación como el método babilónico.
39  Programación / Programación C/C++ / Re: me gusta que me digeran si esta funcion recursiva es asi mas o menos xq m da err en: 31 Octubre 2012, 23:20 pm
Esa función no es recursiva. De hecho sólo veo la función main y tampoco veo ninguna llamada a alguna función.
40  Programación / Programación C/C++ / Re: Queja sobre este subforo. en: 31 Octubre 2012, 23:01 pm
A mi me encanta leer esos códigos. Es un desafío.
Páginas: 1 2 3 [4] 5 6 7 8 9 10 11 12 13
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines