Movatterモバイル変換


[0]ホーム

URL:


Skip to content
DEV Community
Log in Create account

DEV Community

rooyca
rooyca

Posted on • Edited on • Originally published atdablog.pages.dev

PicoCTF Writeup – Reverse Engineering (asm2)

Primeramente me gustaría dejar claro que esta publicación no es más que una traducción. Por lo que todos los creditos van paraMRegra Silva


Información:

Nombre de la plataforma:PicoCTF

Nombre del reto:asm2

Categoría: Ingeniería Inversa

Puntos: 250

PicoCTF 2019.

Descripción del reto:

¿Qué retorna asm2(0xb, 0x2e)? Envía la bandera como un valor hexadecimal (comienza con '0x'). NOTA: El envío para este reto NO será en el formato normal de las banderas.Código.

Pista:Condiciones en ensamblador

Writeup (Inicio)

En este reto, tenemos el código fuente en ensamblador. El archivo se llamatest.S y acontinuación puedes ver el código en cuestion:

asm2:    <+0>:   push   ebp    <+1>:   mov    ebp,esp    <+3>:   sub    esp,0x10    <+6>:   mov    eax,DWORD PTR [ebp+0xc]    <+9>:   mov    DWORD PTR [ebp-0x4],eax    <+12>:  mov    eax,DWORD PTR [ebp+0x8]    <+15>:  mov    DWORD PTR [ebp-0x8],eax    <+18>:  jmp    0x509 <asm2+28>    <+20>:  add    DWORD PTR [ebp-0x4],0x1    <+24>:  sub    DWORD PTR [ebp-0x8],0xffffff80    <+28>:  cmp    DWORD PTR [ebp-0x8],0x63f3    <+35>:  jle    0x501 <asm2+20>    <+37>:  mov    eax,DWORD PTR [ebp-0x4]    <+40>:  leave      <+41>:  ret
Enter fullscreen modeExit fullscreen mode

Como dige anteriormente, esto es código en ensamblador, ya solucioné un reto sobre ensamblador por lo que podría ser parecido, vamos a probar.

Para entender el programa decidí ir línea por línea.

    <+0>:   push   ebp    <+1>:   mov    ebp,esp
Enter fullscreen modeExit fullscreen mode

Como ya sabemosasm2(0xb, 0x2e) está siendo puesto en elstack. Esto pasa en las primeras dos líneas. La primera hacepush deasm2 haciaebp y después se mueve dicho valor haciaesp.

Después de estas dos instrucciones, el estado delstack es el siguiente:

DireccionValorInstrucción
0xc0x2eebp+0xc
0x80xbebp+0x8
0x4retebp+0x4
0x0ebp

Saber esto nos ayuda bastante. Ahora vamos a ver la siguiente instrucción:

<+3>:   sub    esp,0x10
Enter fullscreen modeExit fullscreen mode

En esta instrucción, simplemente estamos a asignando espacio para algunas variables locales, por lo que el stack quedaría así:

DireccionValorInstrucción
0xc0x2eebp+0xc
0x80xbebp+0x8
0x4retebp+0x4
0x0ebp
-0x4local1ebp-0x4
-0x8local2ebp-0x8
-0xclocal3ebp-0xc
-0x10local4ebp-0x10

Continuamos con:

    <+6>:   mov    eax,DWORD PTR [ebp+0xc]    <+9>:   mov    DWORD PTR [ebp-0x4],eax    <+12>:  mov    eax,DWORD PTR [ebp+0x8]    <+15>:  mov    DWORD PTR [ebp-0x8],eax    <+18>:  jmp    0x509 <asm2+28>
Enter fullscreen modeExit fullscreen mode

Vamos instrucción por instruccion:

  1. Primero, le asignamos al registroeax el valor deebp+0xc que sería0x2e, según elstack actual.
  2. Después, movemos el valor del registroeax a ebp-0x4, que en nuestro caso seríalocal1, es decír la variablelocal1 tendría el valor0x2e.
  3. Luego movemos el contenido deepb+0x8 aeax, es decír, su valor sería0xb
  4. En la linea +15 movemos el contenido del registroeax haciaebp-0x8, es decír la variablelocal2 tendría el valor0xb.
  5. Finalmente hacemos un salto haciaasm2+28.

El estado actual delstack es:

DireccionValorInstrucción
0xc0x2eebp+0xc
0x80xbebp+0x8
0x4retebp+0x4
0x0ebp
-0x40x2eebp-0x4
-0x80xbebp-0x8
-0xclocal3ebp-0xc
-0x10local4ebp-0x10

Pasemos a la siguiente instrucción:

    <+28>:  cmp    DWORD PTR [ebp-0x8],0x63f3    <+35>:  jle    0x501 <asm2+20>
Enter fullscreen modeExit fullscreen mode

Como sabrás, la anterior instrucción nos hizo saltar haciaasm2+28, la cual es una comparación seguida de un salto si el resultado es menor o igual que. En este caso, comparamosebp-0x8 (es decir, la variablelocal2 que tiene el valor0xb) y0x63f3. Sabemos que0xb es menor que0x63f3 por lo que hacemos el salto haciaasm2+20.

    <+20>:  add    DWORD PTR [ebp-0x4],0x1    <+24>:  sub    DWORD PTR [ebp-0x8],0xffffff80
Enter fullscreen modeExit fullscreen mode

En la linea +20 tenemos una istrucciónadd, añadimos 1 aebp-0x4, convirtiéndolo en0x2f.
En la linea +24 tenemos una instrucciónsub, restamos0xffffff80 aebp-0x8. Esto es x86 por lo que tenemos que truncar el resultado, para ello simplemente realizamos esta operación en Python:

local2=(local2-0xffffff80)&0xffffffff
Enter fullscreen modeExit fullscreen mode

Ahora el valor delocal2 es:0x8b

Continuando con la siguiente linea nos encontramos nuevamente en la +28 y sabemos que0x8b es menor que0x63f3 por lo que volvemos a dar el salto. Para facilitar el proceso creé unscript en Python que no es más que una "traducción" de este código en ensamblador. Elscript en cuestión es el siguiente:

'''Stack:[  local4 ]  <--- ebp-0x10[  local3 ]  <--- ebp-0xc[  local2 ]  <--- ebp-0x8[  local1 ]  <--- ebp-0x4[   ebp   ][   ret   ]  <--- ebp+0x4[   arg1  ]  <--- ebp+0x8[   arg2  ]  <--- ebp+0xc'''#We know that asm2 receives two argumentsdefasm2(arg1,arg2):#asm2:#<+0>:  push   ebp#<+1>:  mov    ebp,esp#<+3>:  sub    esp,0x10#<+6>:  mov    eax,DWORD PTR [ebp+0xc]eax=arg2#<+9>:  mov    DWORD PTR [ebp-0x4],eaxlocal1=eax#<+12>: mov    eax,DWORD PTR [ebp+0x8]eax=arg1#<+15>: mov    DWORD PTR [ebp-0x8],eaxlocal2=eax#<+18>: jmp    0x509 <asm2+28>#<+20>: add    DWORD PTR [ebp-0x4],0x1#<+24>: sub    DWORD PTR [ebp-0x8],0xffffff80#<+28>: cmp    DWORD PTR [ebp-0x8],0x63f3#<+35>: jle    0x501 <asm2+20>while(local2<=0x63f3):local1=(local1+1)&0xffffffff#This truncates the result to 32 bits.local2=(local2-0xffffff80)&0xffffffff#This truncates the result to 32 bits.'''       It is necessary to truncate the restuls because in python does not have       buffer overflow but 0x86 can have so we have to truncate it.'''#<+37>: mov    eax,DWORD PTR [ebp-0x4]#<+40>: leave#<+41>: retreturnhex(local1)print(asm2(0xb,0x2e))
Enter fullscreen modeExit fullscreen mode

Como dige anteriormente, elscript es una "traducción" como hice antes pero con sintáxis de Python 3. Después de ejecutar el código obtendremos la bandera.


Espero les haya sido de tanta utilidad como a mí, cualquier duda noduden en enviarme un mensaje.

Link del post original:https://mregraoncyber.com/picoctf-writeup-asm2/

Top comments(0)

Subscribe
pic
Create template

Templates let you quickly answer FAQs or store snippets for re-use.

Dismiss

Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment'spermalink.

For further actions, you may consider blocking this person and/orreporting abuse

Good morning, and in case I don’t see ya, good afternoon, good evening, and goodnight!
  • Location
    Colombia
  • Education
    National University of Colombia
  • Pronouns
    he/him
  • Work
    Fullstack
  • Joined

More fromrooyca

DEV Community

We're a place where coders share, stay up-to-date and grow their careers.

Log in Create account

[8]ページ先頭

©2009-2025 Movatter.jp