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ú

Mensajes - lapras

#31
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
Aprende C++, sirve para todo y es eficiente.
Además es multiplataforma, VB no lo es.
#33
Yo no lo sé.
#34
ASM / Re: Shellcode no imprime caracter(64 bits)
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
ASM / Shellcode no imprime caracter(64 bits)
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.

#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <stdlib.h>
 
int (*sc)();
/****************************************************************
0000000000000000 <main>:                                         /
  0: 48 31 c9             xor    %rcx,%rcx                  /
  3: 48 31 c0             xor    %rax,%rax                  /
  6: eb 11                 jmp    19 <n>                     /
                                                                 /
0000000000000008 <et>:                                            /
  8: 59                   pop    %rcx                       /
  9: b0 04                 mov    $0x4,%al                   /
  b: b3 01                 mov    $0x1,%bl                   /
  d: b2 01                 mov    $0x1,%dl                   /
  f: cd 80                 int    $0x80                      /
 11: 48 31 c0             xor    %rax,%rax                  /
 14: 48 ff c0             inc    %rax                       /
 17: cd 80                 int    $0x80                      /
                                                                 /
0000000000000019 <n>:                                             /
 19: e8 ea ff ff ff       callq  8 <et>                     /
                                                                 /
000000000000001e <abc>:                                           /
...                                                           /
******************************************************************/



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";
 
int main(int argc, char **argv) {
 
   char *ptr = mmap(0, sizeof(shellcode),
           PROT_EXEC | PROT_WRITE | PROT_READ, MAP_ANON
           | MAP_PRIVATE, -1, 0);
 
   if (ptr == MAP_FAILED) {
       perror("mmap");
       exit(-1);
   }
 
   memcpy(ptr, shellcode, sizeof(shellcode));
   sc = ptr;
 
   (void)((void(*)())ptr)();
 
   return 0;
}


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.

#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <stdlib.h>
 
int (*sc)();
/****************************************************************
0000000000000000 <main>:                                      /
  0: 48 31 c9             xor    %rcx,%rcx              /
  3: 48 31 c0             xor    %rax,%rax              /
  6: eb 13                 jmp    1b <n>                 /
                                                                 /
0000000000000008 <et>:                                        /
  8: 59                   pop    %rcx                   /
  9: 48 31 c0             xor    %rax,%rax              /
  c: 48 31 db             xor    %rbx,%rbx              /
  f: 48 31 d2             xor    %rdx,%rdx              /
 12: b0 04                 mov    $0x4,%al               /
 14: b3 01                 mov    $0x1,%bl               /
 16: b2 01                 mov    $0x1,%dl               /
 18: cd 80                 int    $0x80                  /
 1a: c3                   retq                          /
                                                             /
000000000000001b <n>:                                         /
 1b: e8 e8 ff ff ff       callq  8 <et>                 /
                                                             /
0000000000000020 <abc>:                                       /
 20: 77                   .byte 0x77                    /
...                                                       /
******************************************************************/



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";
//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";
 
int main(int argc, char **argv) {
 
   char *ptr = mmap(0, sizeof(shellcode),
           PROT_EXEC | PROT_WRITE | PROT_READ, MAP_ANON
           | MAP_PRIVATE, -1, 0);
 
   if (ptr == MAP_FAILED) {
       perror("mmap");
       exit(-1);
   }
 
   memcpy(ptr, shellcode, sizeof(shellcode));
   sc = ptr;
 
   (void)((void(*)())ptr)();
   printf("\n");
 
   return 0;
}


El código de nasm es el siguiente:
Código (asm) [Seleccionar]

;EXAMPLE VARIABLES IN LINUX


global main

main:                           ; main

xor rcx, rcx            ; eficient way turning register to 0
xor rax, rax            ; exclusive or
         
jmp n            
et:
pop rcx

xor rax, rax
xor rbx, rbx
xor rdx, rdx
mov al, 4                      ; Number of system call (write)
mov bl, 1                      ; argument(1=stdout)
mov dl, 1                      ; number of characters
int 0x80

ret

n:
call et
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
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 (cpp) [Seleccionar]
#include <iostream>
#include <cmath>
#include <string.h>

using namespace std;

string* _sqrt(string num);
string* chunk_split(string source, int length = 2);
string substr(string source, int start, int end);
int chrpos(char s, char *str);

int main(){
string s;

cout << "Insert a number:\n> ";
cin >> s;

_sqrt(s);

//cin.get();
cin.get();
return 0;
}

int chrpos(char s, char *str){
for(int i=0,c=(int)strlen(str);i<c;i++){
if(str[i] == s) return i;
}
return -1;
}

string* chunk_split(string source, int length){
int j = 0, t = (int)ceil((int)source.length()/2);
string* r= new string[t+1]; //remember to delete
for(int i=0;i<source.length();i+=length){
r[j] = substr(source, i, ((source.length()-i==1)?(i+length-2):(i+length-1)));
++j;
}
return r;
}

string substr(string source, int start, int end){
string r = "";
for(int i=start,c=end;i<=c;i++){
r += source[i];
}
return r;
}

string* _sqrt(string num){
const int l = (int)ceil((int)num.length()/2);
string* arr = chunk_split(substr(num, 0, num.length()-1 ), 2);
for(int i=0;i<l+1;i++){
cout << "arr[" << i << "] = " << arr[i] << endl;
}

// cout << substr(num, 4, 4);
return arr;
}


De todos modos revisaré el código.
#37
(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).

CitarY 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
Un problema es la asignación de strings:
Código (cpp) [Seleccionar]
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 (cpp) [Seleccionar]
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<cmath>
using namespace std;

int main(){
string hole[5]="hole";
hole[1]="hole";
cout<<hole[3]<<endl;
}

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 (cpp) [Seleccionar]
#include <iostream>
#include <cmath>
#include <string.h>

using namespace std;

string* _sqrt(string num);
string* chunk_split(string source, int length = 2);
string substr(string source, int start, int end);
int chrpos(char s, char *str);

int main(){
string s;

cout << "Insert a number:\n> ";
cin >> s;

_sqrt(s);

//cin.get();
cin.get();
return 0;
}

int chrpos(char s, char *str){
for(int i=0,c=(int)strlen(str);i<c;i++){
if(str[i] == s) return i;
}
return -1;
}

string* chunk_split(string source, int length){
int j = 0, t = (int)ceil((int)source.length()/2);
string* r= new string[t+1]; //remember to delete
for(int i=0;i<source.length();i+=length){
r[j] = substr(source, i, ((source.length()-i==1)?(i+length-2):(i+length-1)));
++j;
}
return r;
}

string substr(string source, int start, int end){
string r = "";
for(int i=start,c=end;i<=c;i++){
r += source[i];
}
return r;
}

string* _sqrt(string num){
const int l = (int)ceil((int)num.length()/2);
string* arr = chunk_split(substr(num, 0, num.length()-1 ), 2);
for(int i=0;i<l+1;i++){
cout << "arr[" << i << "] = " << arr[i] << endl;
}

// cout << substr(num, 4, 4);
return arr;
}


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
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
A mi me encanta leer esos códigos. Es un desafío.