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

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  De Perl a C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: De Perl a C  (Leído 15,384 veces)
krootca

Desconectado Desconectado

Mensajes: 4



Ver Perfil
De Perl a C
« en: 30 Agosto 2023, 20:20 pm »

Hola buenas tardes, he estado intentando convertir este código de Perl a C en una función llama pvepush, pero aun no logro que la salida de código sea similar a la de Perl, básicamente este código de Perl sirve para convertir cadenas de texto en un direcciones para la pila, me gustaría que me den alguna ayuda para que el código funcione de manera similar al de Perl:

El código de C es este:
Código
  1. void pvepush(char* strToPush) {
  2.    if (strlen(strToPush) == 0) {
  3.        printf("usage: pvepush \"String to put on stack\"\n");
  4.        return;
  5.    }
  6.  
  7.    printf("String length: %ld\n", strlen(strToPush));
  8.    printf("Opcodes to push this string onto the stack:\n\n");
  9.  
  10.    int cnt = 0;
  11.    int bytecnt = 0;
  12.    char strHex[13] = "";
  13.    char strOpcodes[1000] = "";
  14.    char strPush[100] = "";
  15.  
  16.    while (cnt < strlen(strToPush)) {
  17.        char strThisChar[5];
  18.        sprintf(strThisChar, "\\x%02x", strToPush[cnt]);
  19.  
  20.        if (bytecnt < 3) {
  21.            strcat(strHex, strThisChar);
  22.            bytecnt++;
  23.        } else {
  24.            if (strlen(strHex) < 12) {
  25.                strcat(strHex, "\\x20");
  26.            }
  27.  
  28.            sprintf(strPush, "\"\\x68%s\" //PUSH 0x%s%s%s%s\n", strHex, &strHex[8], &strHex[6], &strHex[4], &strHex[2]);
  29.            strcat(strOpcodes, strPush);
  30.            strcpy(strHex, "");
  31.            bytecnt = 0;
  32.        }
  33.  
  34.        cnt++;
  35.    }
  36.  
  37.    if (strlen(strHex) > 0) {
  38.        sprintf(strPush, "\"\\x68%s\\x00\" //PUSH 0x%s%s%s%s\n", strHex, &strHex[8], &strHex[6], &strHex[4], &strHex[2]);
  39.        strcat(strOpcodes, strPush);
  40.    } else {
  41.        strcat(strOpcodes, "\"\\x68\\x20\\x20\\x20\\x00\" //PUSH 0x00202020\n");
  42.    }
  43.  
  44.    printf("%s", strOpcodes);
  45. }
  46.  

El código de Perl es este:
Código
  1. # Este script toma una cadena como argumento
  2. # y producirá los opcodes
  3. # para empujar esta string a la pila.
  4.  
  5. use strict;
  6. use warnings;
  7.  
  8. # Comprobar que se proporcionó un argumento
  9. if ($#ARGV ne 0) {
  10.  print " usage: $0 ".chr(34)."String to put on stack".chr(34)."\n";
  11.  exit(0);
  12. }
  13.  
  14. # Convertir la cadena a bytes
  15. my $strToPush = $ARGV[0];
  16. my $strThisChar = "";
  17. my $strThisHex = "";
  18. my $cnt = 0;
  19. my $bytecnt = 0;
  20. my $strHex = "";
  21. my $strOpcodes = "";
  22. my $strPush = "";
  23.  
  24. # Imprimir la longitud de la cadena
  25. print "String length : " . length($strToPush)."\n";
  26.  
  27. # Iterar a través de cada carácter en la cadena
  28. while ($cnt < length($strToPush)) {
  29.  # Obtener el siguiente carácter de la cadena
  30.  $strThisChar = substr($strToPush, $cnt, 1);
  31.  
  32.  # Convertir el carácter a su representación hexadecimal
  33.  $strThisHex = "\\x".ascii_to_hex($strThisChar);
  34.  
  35.  # Agregar el carácter hexadecimal a la cadena de hexadecimales
  36.  if ($bytecnt < 3) {
  37.    $strHex .= $strThisHex;
  38.    $bytecnt++;
  39.  } else {
  40.    # Imprimir la cadena de hexadecimales y el opcode PUSH
  41.    $strPush = $strHex.$strThisHex;
  42.    $strPush =~ tr/\\x//d;
  43.    $strOpcodes .= chr(34)."\\x68".$strHex.$strThisHex.chr(34).
  44.      " //PUSH 0x".substr($strPush, 6, 2).substr($strPush, 4, 2).
  45.      substr($strPush, 2, 2).substr($strPush, 0, 2)."\n";
  46.  
  47.    $strHex = "";
  48.    $bytecnt = 0;
  49.  }
  50.  
  51.  # Incrementar el contador de caracteres
  52.  $cnt++;
  53. }
  54.  
  55. # Imprimir la última línea de opcodes
  56. if (length($strHex) > 0) {
  57.  # Agregar espacios a la cadena de hexadecimales para completar los 12 bytes
  58.  while (length($strHex) < 12) {
  59.    $strHex .= "\\x20";
  60.  }
  61.  
  62.  # Imprimir la cadena de hexadecimales y el opcode PUSH
  63.  $strPush = $strHex.$strThisHex;
  64.  $strPush =~ tr/\\x//d;
  65.  $strOpcodes .= chr(34)."\\x68".$strHex.$strThisHex.chr(34).
  66.    " //PUSH 0x".substr($strPush, 4, 2).substr($strPush, 2, 2).substr($strPush, 0, 2)."\n";
  67. } else {
  68.  # Agregar la línea con espacios + el byte nulo (terminador de cadena)
  69.  $strOpcodes .= chr(34)."\\x68\\x20\\x20\\x20\\x00".chr(34).
  70.    " //PUSH 0x00202020"."\n";
  71. }
  72.  
  73. # Imprimir los opcodes generados
  74. print $strOpcodes;
  75.  
  76. # Función para convertir un carácter ASCII a hexadecimal
  77. sub ascii_to_hex ($) {
  78.  (my $str = shift) =~ s/(.|\n)/sprintf("%02lx", ord $1)/eg;
  79.  return $str;
  80. }
  81.  


Con respecto a la salida de código despues de compilar y pasarle un string "hola" en el script de C:
Código
  1. String length: 4
  2. Opcodes to push this string onto the stack:
  3.  
  4. "\x68\x68\x6f\x6c" //PUSH 0x\x6c6f\x6c\x6f\x6c68\x6f\x6c
  5. "\x68\x20\x20\x20\x00" //PUSH 0x00202020
  6.  
  7.  

Con la salida de Perl con el mismo string "hola":
Código
  1. String length : 4
  2. "\x68\x68\x6f\x6c\x61" //PUSH 0x616c6f68
  3. "\x68\x20\x20\x20\x00" //PUSH 0x00202020
  4.  
  5.  

Nota: El código de Perl es de Peter Van Eeckhoutte


« Última modificación: 30 Agosto 2023, 21:46 pm por krootca » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: De Perl a C
« Respuesta #1 en: 31 Agosto 2023, 00:00 am »

Algo así. No entendí lo de los 12 bytes ni la línea con espacios.

Código
  1. void pvepush(char* strToPush) {
  2.    char strOpcodes[1024] = "\"\\x68";
  3.    char strHex[6];
  4.    size_t strToPush_len = strlen(strToPush);
  5.  
  6.    if (strToPush_len == 0) {
  7.        printf("usage: pvepush \"String to put on stack\"\n");
  8.        return;
  9.    }
  10.  
  11.    printf("String length: %ld\n", strToPush_len);
  12.    printf("Opcodes to push this string onto the stack:\n\n");
  13.  
  14.    for(size_t i = 0; i < strToPush_len; ++i) {
  15.        sprintf(strHex, "\\x%x", strToPush[i]);
  16.        strcat(strOpcodes, strHex);
  17.    }
  18.  
  19.    strcat(strOpcodes, "\" //PUSH ");
  20.  
  21.    for(size_t i = strToPush_len; i > 0; --i) {
  22.        sprintf(strHex, "%x", strToPush[i-1]);
  23.        strcat(strOpcodes, strHex);
  24.    }
  25.  
  26.    printf("%s\n", strOpcodes);
  27. }


En línea

krootca

Desconectado Desconectado

Mensajes: 4



Ver Perfil
Re: De Perl a C
« Respuesta #2 en: 31 Agosto 2023, 01:03 am »

El código es funcional, pero con respecto al al código de perl, por ejemplo en perl sale algo así al agregar una linea caracter más, osea "holaa":
Código
  1. String length : 5
  2. Opcodes to push this string onto the stack :
  3.  
  4. "\x68\x61\x20\x20\x00" //PUSH 0x00202061
  5. "\x68\x68\x6f\x6c\x61" //PUSH 0x616c6f68
  6.  

En cambio con respecto al código c "holaa":
Código
  1. String length: 5
  2. Opcodes to push this string onto the stack:
  3.  
  4. "\x68\x68\x6f\x6c\x61\x61" //PUSH 61616c6f68
  5.  

El objetivo es que no pierda la funcionalidad del código que hizo Peter Van Eeckhoutte, basicamente transladarlo al codigo en C, he hecho una versión del código de Peter en Perl comentada linea por linea para explicar el funcionamiento del código:
Código
  1. #!/usr/bin/perl
  2. # Scrit de Perl escrito por Peter Van Eeckhoutte
  3. # http://www.corelan.be:8800
  4. # Este script toma una string como argumento
  5. # y producirá los opcodes
  6. # para empujar esta string a la pila.
  7. #
  8.  
  9.  
  10. # La primera línea, if ($#ARGV ne 0), verifica si el usuario ha proporcionado algún argumento
  11. # al programa. Si el usuario no ha proporcionado ningún argumento,
  12. # el programa imprimirá un mensaje de uso y se cerrará.
  13.  
  14. if ($#ARGV ne 0) {
  15.    print " usage: $0 ".chr(34)."String to put on stack".chr(34)."\n";
  16.    exit(0);
  17. }
  18.  
  19.  
  20. ##############
  21. # Las siguientes líneas con variables
  22. # de convertir string a bytes
  23. # my $strToPush=$ARGV[0], my $strThisChar="", my $strThisHex="", my $cnt=0, my $bytecnt=0, my $strHex="", my $strOpcodes="", y my $strPush=""
  24. # declaran algunas variables e inicializan sus valores.
  25. # La variable $strToPush almacenará la cadena que el usuario ha proporcionado como argumento.
  26.  
  27. my $strToPush=$ARGV[0]; #argumento que el usuario proporcionó
  28. my $strThisChar=""; #caracter actual
  29. my $strThisHex=""; #representacion hexadecimal
  30. my $cnt=0; # se utilizará para hacer un bucle while
  31. my $bytecnt=0; # recuento de bytes
  32. my $strHex=""; # la representación hex de los tres bytes actuales
  33. my $strOpcodes=""; # el texto que proximamente va almacenar los opcodes
  34. my $strPush=""; # el texto que almacenara la cadena de instrucciones
  35.  
  36. # Las variables $strThisChar, $strThisHex, $cnt, $bytecnt, $strHex, y $strOpcodes
  37. # se utilizarán para almacenar el carácter actual, su representación hexadecimal, el recuento de bytes actual,
  38. # la representación hexadecimal de los tres bytes actuales, y la cadena de instrucciones, respectivamente.
  39. ##############
  40.  
  41.  
  42. ##############
  43. # La siguiente línea, print "String length : " . length($strToPush), imprime la longitud de la cadena en la consola.
  44. print "Numero de strings : " . length($strToPush)."\n";
  45.  
  46. # La siguiente línea, print "Opcodes to push this string onto the stack :\n\n", imprime un mensaje en la consola indicando que las siguientes líneas imprimirán las instrucciones para empujar la cadena a la pila.
  47. print "Opcodes para pushear estos strings en el stack :\n\n";
  48. ##############
  49.  
  50. ##############
  51. # El bucle while, while ($cnt < length($strToPush)) itera sobre los caracteres de
  52. # la cadena. Para cada carácter, se realizan los siguientes pasos:
  53.  
  54. # 1- El carácter actual se almacena en la variable $strThisChar.
  55. # 2- La representación hexadecimal del carácter actual se almacena en la variable $strThisHex.
  56. # 3- El recuento de bytes se incrementa.
  57. # 4- Si el recuento de bytes es menor que 3, la representación hexadecimal del carácter actual se agrega a la variable $strHex.
  58. # 5- De lo contrario, la representación hexadecimal de los tres bytes actuales se almacena en la variable $strPush. Los caracteres en $strPush se convierten luego a sus representaciones ASCII y la cadena resultante se almacena de vuelta en $strPush. La representación hexadecimal de los tres bytes actuales también se agrega a la variable $strOpcodes.
  59. # 6- El recuento de bytes se reinicia a 0.
  60. # 7- El contador $cnt se incrementa.
  61. # 8- El bucle while continúa hasta que se alcanza el final de la cadena.
  62.  
  63. # Finalmente, la cadena de instrucciones se imprime en la consola
  64.  
  65. while ($cnt < length($strToPush)){ #itera para cada caracter
  66.    $strThisChar=substr($strToPush,$cnt,1); #caracter actual
  67.    $strThisHex="\\x".ascii_to_hex($strThisChar); #representacion hex del caracter actual
  68.    if ($bytecnt < 3){ #si el recuento de bytes es menor a 3 entra aqui
  69.        $strHex=$strHex.$strThisHex; # la representación hexadecimal del carácter actual se agrega a la variable $strHex.
  70.        $bytecnt=$bytecnt+1; #el recuento de bytes aumenta en 1
  71.  
  72. ##############
  73. #La primera línea, }else{, se ejecuta si la variable $strHex está vacía.
  74. #Esto significa que el bucle while no se ejecutó y la variable $strHex no se llenó con la representación hexadecimal de la cadena.
  75.    }else{
  76.        $strPush = $strHex.$strThisHex; #combinan la representación hexadecimal de la cadena actual ($strThisHex) con la representación hexadecimal que se ha acumulado hasta el momento ($strHex).
  77.        $strPush =~ tr/\\x//d; #convierte la representación hexadecimal de la cadena en su representación ASCII. Esto se hace para que la cadena se pueda imprimir en la consola.
  78.  
  79.        ########
  80.        # La siguiente linea $strHex crea una nueva cadena que representa la instrucción PUSH para la cadena actual
  81.        # La cadena comienza con el carácter ", seguido de la representación hexadecimal de la instrucción PUSH,
  82.        # seguida de la representación hexadecimal de la cadena actual, seguida del carácter"`.
  83.        #
  84.        # La cadena también incluye un comentario que indica el valor hexadecimal de la cadena actual.
  85.        $strHex=chr(34)."\\x68".$strHex.$strThisHex.chr(34)." //PUSH 0x".substr($strPush,6,2).substr($strPush,4,2).substr($strPush,2,2).substr($strPush,0,2);
  86.        #########
  87.  
  88.        $strOpcodes=$strHex."\n".$strOpcodes; #agrega la nueva cadena a la variable $strOpcodes. La variable $strOpcodes contiene una cadena de todas las instrucciones PUSH que se han generado.
  89.        $strHex="";#borra la variable $strHex para prepararla para la siguiente cadena.
  90.        $bytecnt=0; #reinicia el recuento de bytes
  91.    }
  92.    $cnt=$cnt+1; #aumenta el valor para para el bucle
  93. }
  94.  
  95. ##############
  96. # Esta línea verifica si la variable $strHex no está vacía. Si no está vacía, entonces se ejecutará el siguiente código:
  97. if (length($strHex) > 0){
  98. ########
  99. # Este bucle while asegura que la variable $strHex tenga una longitud de 12. Si la longitud de $strHex es menor que 12,
  100. # entonces el carácter \x20 (que es un carácter de espacio en hexadecimal) se agrega a $strHex hasta que la longitud sea 12.
  101.    while(length($strHex) < 12){
  102.        $strHex=$strHex."\\x20";
  103.    }
  104.  
  105. ########
  106. # Estas dos siguientes líneas convierten la representación hexadecimal de la cadena en
  107. # $strHex a su representación ASCII y la almacenan en la variable $strPush.
  108.    $strPush = $strHex;
  109.    $strPush =~ tr/\\x//d;
  110. ###############
  111. ##### Esta línea crea una nueva cadena que contiene la representación hexadecimal del opcode PUSH, seguido de la representación
  112. ##### hexadecimal de la cadena en $strHex, seguido de un byte NULL (\x00).
  113. #####
  114. ##### La representación hexadecimal de la cadena en
  115. ##### $strHex se obtiene tomando los primeros cuatro caracteres de $strPush, los siguientes dos caracteres de $strPush y los
  116. ##### últimos dos caracteres de $strPush.
  117.    $strHex=chr(34)."\\x68".$strHex."\\x00".chr(34)." //PUSH 0x00".substr($strPush,4,2).substr($strPush,2,2).substr($strPush,0,2); #generar una instrucción PUSH que empuja un byte NULL a la pila.
  118. ###############
  119. #### agrega la nueva cadena a la variable $strOpcodes. La variable $strOpcodes contiene una cadena de todas las instrucciones PUSH que se han generado.
  120.    $strOpcodes=$strHex."\n".$strOpcodes;
  121. ################
  122. ################
  123. }else{ #se ejecuta si la variable $strHex está vacía
  124.    # Esta cadena representa la representación hexadecimal del opcode PUSH, seguido de cuatro espacios seguido de un byte NULL.
  125.    $strOpcodes=chr(34)."\\x68\\x20\\x20\\x20\\x00".chr(34)." //PUSH 0x00202020"."\n".$strOpcodes;
  126. }
  127.  
  128. print $strOpcodes; #imprime el valor de la variable $strOpcodes a la consola.
  129.  
  130. ############
  131. # se utiliza para convertir una cadena a su representación hexadecimal.
  132. # La función toma una cadena como argumento y devuelve una nueva cadena
  133. # que contiene la representación hexadecimal de la cadena original.
  134. sub ascii_to_hex ($){
  135.    # Esta siguente línea convierte la cadena que se pasa como argumento a su representación hexadecimal.
  136.    # La expresión regular (.|\n) hace coincidir cualquier carácter, incluyendo el carácter de nueva línea (\n).
  137.    # La función sprintf() formatea el resultado de la expresión regular como un número hexadecimal de dos caracteres.
  138.    (my $str = shift) =~ s/(.|\n)/sprintf("%02lx", ord $1)/eg;
  139.  
  140.  
  141.    return $str; #retorna $str
  142. }
  143. ############
  144.  
En línea

explorer

Desconectado Desconectado

Mensajes: 101


Analista/Programador Perl


Ver Perfil
Re: De Perl a C
« Respuesta #3 en: 31 Agosto 2023, 14:55 pm »

En esta línea:

Código
  1. sprintf(strPush, "\"\\x68%s\" //PUSH 0x%s%s%s%s\n", strHex, &strHex[8], &strHex[6], &strHex[4], &strHex[2]);

estás pasando la dirección de inicio de strHex, strHex[8], strHex[6]... como cadenas de caracteres (%s), pero no estás indicando cuántos caracteres de largo tienen esas cadenas de caracteres.

Quizás debería ser

Código
  1. sprintf(strPush, "\"\\x68%s\" //PUSH 0x%2s%2s%2s%2s\n", ...

En el código Perl aparecen recortados a 2 caracteres:
Código
  1. substr($strPush,6,2)
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: De Perl a C
« Respuesta #4 en: 31 Agosto 2023, 16:41 pm »

Entonces en tu ejemplo original en vez de
Código:
String length : 4
"\x68\x68\x6f\x6c\x61" //PUSH 0x616c6f68
"\x68\x20\x20\x20\x00" //PUSH 0x00202020

Debería ser
Código:
String length : 4
"\x68\x20\x20\x20\x00" //PUSH 0x00202020
"\x68\x68\x6f\x6c\x61" //PUSH 0x616c6f68

Porque el byte '\x00' debe ir siempre en la primera línea en la última posición.



Un bonito ejercicio. Creo que esto hace lo que pides:

Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. // para cortar la cadena en CHUNK bytes
  6. #define CHUNK 4
  7.  
  8. char *strNormalizer(const char *);
  9. char *hexLeftToRight(const char *);
  10. char *hexRightToLeft(const char *);
  11.  
  12. void pvepush(char *strToPush) {
  13.    // aloja el resultado
  14.    char strOpcodes[1024] = "";
  15.    // contiene espacio necesario para alojar la cadena representativa del byte en hexadecimal
  16.    char *aux;
  17.    // contiene una copia de strToPush con un tamaño múltiplo de CHUNK
  18.    char *normalizedStr;
  19.    // tamaño de la cadena strToPush
  20.    size_t strToPush_len = strlen(strToPush);
  21.    // tamaño de la cadena normalizada
  22.    size_t normalized_len;
  23.  
  24.    // La cadena argumento está vacía. Avisar y regresar.
  25.    if (strToPush_len == 0) {
  26.        printf("usage: pvepush \"String to put on stack\"\n");
  27.        return;
  28.    }
  29.  
  30.    printf("String length: %ld\n", strToPush_len);
  31.    printf("Opcodes to push this string onto the stack:\n\n");
  32.  
  33.    // Normaliza la cadena strToPush y obtiene el tamaño total
  34.    normalizedStr = strNormalizer(strToPush);
  35.    normalized_len = strlen(normalizedStr) + 1;
  36.  
  37.    // Bucle. Va tomando CHUNK bytes desde el final hasta el inicio
  38.    for(int i = normalized_len - CHUNK; i >= 0; i -= CHUNK) {
  39.        // dato fijo
  40.        strcat(strOpcodes, "\"\\x68");
  41.  
  42.        // concatena el trozo obtenido con los bytes de izquierda a derecha
  43.        aux = hexLeftToRight(&normalizedStr[i]);
  44.        strcat(strOpcodes, aux);
  45.        free(aux);
  46.  
  47.        // dato fijo
  48.        strcat(strOpcodes, "\" //PUSH 0x");
  49.  
  50.        // concatena el trozo obtenido con los bytes de derecha a izquierda
  51.        aux = hexRightToLeft(&normalizedStr[i]);
  52.        strcat(strOpcodes, aux);
  53.        free(aux);
  54.  
  55.        // dato fijo
  56.        strcat(strOpcodes, "\n");
  57.    }
  58.  
  59.    free(normalizedStr);
  60.  
  61.    // Muestra el resultado
  62.    printf("%s\n", strOpcodes);
  63. }
  64.  
  65. // Normaliza la cadena original adaptándola a un tamaño múltiplo de CHUNK. Rellena con espacios por la derecha.
  66. char *strNormalizer(const char *original) {
  67.    size_t original_len = strlen(original);
  68.    size_t retValue_len;
  69.    char *retValue;
  70.  
  71.    retValue_len = original_len + (CHUNK - original_len % CHUNK);
  72.    retValue = calloc(retValue_len, sizeof(char));
  73.  
  74.    strcpy(retValue, original);
  75.    for(int i = original_len; i < retValue_len - 1; ++i) {
  76.        retValue[i] = ' ';
  77.    }
  78.  
  79.    return retValue;
  80. }
  81.  
  82. // Devuelve una cadena representando en hexadecimal los bytes de la cadena original.
  83. // El sentido será el mismo que el de la cadena original.
  84. // Cada byte tendrá el prefijo \x
  85. char *hexLeftToRight(const char *original) {
  86.    char *retValue = malloc(6 * CHUNK * sizeof(char));
  87.    char strHex[6];
  88.  
  89.    for(size_t i = 0; i < CHUNK; ++i) {
  90.        sprintf(strHex, "\\x%.2x", original[i]);
  91.        strcat(retValue, strHex);
  92.    }
  93.  
  94.    return retValue;
  95. }
  96.  
  97. // Devuelve una cadena representando en hexadecimal los bytes de la cadena original.
  98. // El sentido inverso a la cadena original.
  99. char *hexRightToLeft(const char *original) {
  100.    char *retValue = malloc(3 * CHUNK * sizeof(char));
  101.    char strHex[3];
  102.  
  103.    for(size_t i = CHUNK; i > 0; --i) {
  104.        sprintf(strHex, "%.2x", original[i-1]);
  105.        strcat(retValue, strHex);
  106.    }
  107.  
  108.    return retValue;
  109. }
  110.  
  111. int main() {
  112.    pvepush("hola");
  113. }
  114.  

Aunque lo veo un poco tocho, seguro que se puede optimizar más.
« Última modificación: 31 Agosto 2023, 23:55 pm por Eternal Idol » En línea

krootca

Desconectado Desconectado

Mensajes: 4



Ver Perfil
Re: De Perl a C
« Respuesta #5 en: 1 Septiembre 2023, 22:11 pm »

La verdad que te ha salido bastante bien @MAFUS, sin embargo hay en el script de Perl algo más:

-Cuando supera 3 caracteres hace un nuevo push, ejemplo:

Código
  1. ; Al principio siempre pone \x68, seguido de el hex del string:
  2.  
  3. # string "ñ"    \x68[\xf1]\x20\x20\x00 invertido 00 20 20 [f1]
  4. # string "ña"   \x68[\xf1\x61]\x20\x00 invertido 00 20 [61 f1]
  5. # string "ñap"  \x68[\xf1\x61\x70]\x00 invertido 00 [70 61 f1]
  6. ; Cuando supera los 3 caracteres hace esto: por ejemplo aqui le puse "ñapa"
  7. #   \x68\x20\x20\x20\x00   invertido 00 20 20 20
  8. # string "ñapa" \x68[\xf1\x61\x70\x61] invertido [61 70 61 f1]
  9. ; y cuando pasa los 4 caracteres, pasa esto:
  10. #            \x68\xf6\x20\x20\x00    invertido 00 20 20 [f6]
  11. # string "ñapal" \x68[\xf1\x61\x70\x61] invertido 61 70 61 f1]
  12. ; la secuencia se repite, nuevamente cuando pasa los 7 caracteres, para llegar a 8 hace lo mismo que cuando pasa los 3 caracteres
  13.  

« Última modificación: 1 Septiembre 2023, 23:25 pm por krootca » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: De Perl a C
« Respuesta #6 en: 2 Septiembre 2023, 00:31 am »

Creo que eso está resuelto:



Entrada: abc

Salida:
String length: 3
Opcodes to push this string onto the stack:

"\x68\x61\x62\x63\x00" //PUSH 0x00636261




Entrada: abcd

Salida:
String length: 4
Opcodes to push this string onto the stack:

"\x68\x20\x20\x20\x00" //PUSH 0x00202020
"\x68\x61\x62\x63\x64" //PUSH 0x64636261




Entrada: abcde

Salida:
String length: 5
Opcodes to push this string onto the stack:

"\x68\x65\x20\x20\x00" //PUSH 0x00202065
"\x68\x61\x62\x63\x64" //PUSH 0x64636261
En línea

krootca

Desconectado Desconectado

Mensajes: 4



Ver Perfil
Re: De Perl a C
« Respuesta #7 en: 2 Septiembre 2023, 03:46 am »

Oh ya, ahora lo probé, me había confundido con otro script que me pertenecia :rolleyes:, la verdad que bastante bien hecho!  ;)
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: De Perl a C
« Respuesta #8 en: 9 Septiembre 2023, 12:50 pm »

Resuelto un bug por el que el programa sacaba basura cuando se compilaba y ejecutaba en Windows.

Cambiada la función de malloc por calloc en hexLeftToRight y hexRightToLeft.

Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. // para cortar la cadena en CHUNK bytes
  6. #define CHUNK 4
  7.  
  8. char *strNormalizer(const char *);
  9. char *hexLeftToRight(const char *);
  10. char *hexRightToLeft(const char *);
  11.  
  12. void pvepush(char *strToPush) {
  13.    // aloja el resultado
  14.    char strOpcodes[1024] = "";
  15.    // contiene espacio necesario para alojar la cadena representativa del byte en hexadecimal
  16.    char *aux;
  17.    // contiene una copia de strToPush con un tamaño múltiplo de CHUNK
  18.    char *normalizedStr;
  19.    // tamaño de la cadena strToPush
  20.    size_t strToPush_len = strlen(strToPush);
  21.    // tamaño de la cadena normalizada
  22.    size_t normalized_len;
  23.  
  24.    // La cadena argumento está vacía. Avisar y regresar.
  25.    if (strToPush_len == 0) {
  26.        printf("usage: pvepush \"String to put on stack\"\n");
  27.        return;
  28.    }
  29.  
  30.    printf("String length: %ld\n", strToPush_len);
  31.    printf("Opcodes to push this string onto the stack:\n\n");
  32.  
  33.    // Normaliza la cadena strToPush y obtiene el tamaño total
  34.    normalizedStr = strNormalizer(strToPush);
  35.    normalized_len = strlen(normalizedStr) + 1;
  36.  
  37.    // Bucle. Va tomando CHUNK bytes desde el final hasta el inicio
  38.    for(int i = normalized_len - CHUNK; i >= 0; i -= CHUNK) {
  39.        // dato fijo
  40.        strcat(strOpcodes, "\"\\x68");
  41.  
  42.        // concatena el trozo obtenido con los bytes de izquierda a derecha
  43.        aux = hexLeftToRight(&normalizedStr[i]);
  44.        strcat(strOpcodes, aux);
  45.        free(aux);
  46.  
  47.        // dato fijo
  48.        strcat(strOpcodes, "\" //PUSH 0x");
  49.  
  50.        // concatena el trozo obtenido con los bytes de derecha a izquierda
  51.        aux = hexRightToLeft(&normalizedStr[i]);
  52.        strcat(strOpcodes, aux);
  53.        free(aux);
  54.  
  55.        // dato fijo
  56.        strcat(strOpcodes, "\n");
  57.    }
  58.  
  59.    free(normalizedStr);
  60.  
  61.    // Muestra el resultado
  62.    printf("%s\n", strOpcodes);
  63. }
  64.  
  65. // Normaliza la cadena original adaptándola a un tamaño múltiplo de CHUNK. Rellena con espacios por la derecha.
  66. char *strNormalizer(const char *original) {
  67.    size_t original_len = strlen(original);
  68.    size_t retValue_len;
  69.    char *retValue;
  70.  
  71.    retValue_len = original_len + (CHUNK - original_len % CHUNK);
  72.    retValue = calloc(retValue_len, sizeof(char));
  73.  
  74.    strcpy(retValue, original);
  75.    for(int i = original_len; i < retValue_len - 1; ++i) {
  76.        retValue[i] = ' ';
  77.    }
  78.  
  79.    return retValue;
  80. }
  81.  
  82. // Devuelve una cadena representando en hexadecimal los bytes de la cadena original.
  83. // El sentido será el mismo que el de la cadena original.
  84. // Cada byte tendrá el prefijo \x
  85. char *hexLeftToRight(const char *original) {
  86.    char *retValue = calloc(6 * CHUNK, sizeof(char));
  87.    char strHex[6];
  88.  
  89.    for(size_t i = 0; i < CHUNK; ++i) {
  90.        sprintf(strHex, "\\x%.2x", original[i]);
  91.        strcat(retValue, strHex);
  92.    }
  93.  
  94.    return retValue;
  95. }
  96.  
  97. // Devuelve una cadena representando en hexadecimal los bytes de la cadena original.
  98. // El sentido inverso a la cadena original.
  99. char *hexRightToLeft(const char *original) {
  100.    char *retValue = calloc(3 * CHUNK, sizeof(char));
  101.    char strHex[3];
  102.  
  103.    for(size_t i = CHUNK; i > 0; --i) {
  104.        sprintf(strHex, "%.2x", original[i-1]);
  105.        strcat(retValue, strHex);
  106.    }
  107.  
  108.    return retValue;
  109. }
  110.  
  111. int main() {
  112.    pvepush("hola");
  113. }
  114.  
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
MSN Perl y PHP
Scripting
isseu 0 2,673 Último mensaje 30 Diciembre 2008, 14:36 pm
por isseu
Libros de Perl online [PERL]
Scripting
madpitbull_99 0 3,835 Último mensaje 18 Mayo 2011, 21:49 pm
por madpitbull_99
[Perl] Creacion de un Joiner en Perl
Scripting
BigBear 0 2,790 Último mensaje 15 Marzo 2013, 16:12 pm
por BigBear
[PERL]Busco recomendacion para empezar con Perl
Scripting
Ocelot1994 1 2,409 Último mensaje 6 Julio 2016, 10:59 am
por explorer
[Perl] Salió Perl v5.28
Scripting
explorer 2 2,335 Último mensaje 26 Junio 2018, 22:23 pm
por explorer
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines