0x00: dragon 是一个UAF漏洞的利用。

  • UseAfterFree 是堆的漏洞利用的一种 简单介绍 https://www.owasp.org/index.php/Using_freed_memory
  • 简单的来说就是 再次使用了 free 掉的内存

0x01:简单看一下

运行起来看一下

是一个RPG游戏,有两种角色,每个角色的技能不一样(战士法师之类的吧...)

在进IDA分析的时候,发现龙是分两种的 baby_dragon 和 mommy_dragon,两种的血量和攻击力也各不相同。

而且龙的结构体是通过动态分配,填充数据,在龙死亡之后这部分内存free掉,再次游戏就会再分配内存...如此循环

此外,发现一个神秘关卡

看着很美好,但是没什么x用,读取字符串限定长度,所以从这里拿不到shell的~

0x02:分析

还是要从内存分配上下手,只有先打赢dragon才可以free内存,再次分配,才会有机会玩。

会去看看龙的结构体
在dragon结构体中,表示血量的数据存储在 eax+8 的地方,还是 1 byte 的大小,范围应该是 0~127
龙种类有两种,我们需要出现mama dragon(血多,打的少)

龙的血量在小于零的时候就会死亡!这点很关键。

RPG游戏的角色有两个,knight和priest。每个角色技能不一样。
priest 的 3 可以 使用mp 使得 dragon攻击无效,这时候dragon血量会恢复。那就可以使用priest,耗到dragon血量 溢出,一旦小于零(溢出),那么dragon就死了,也就是让它加血加到溢出。
 
0x03:控制流程
IDA里查看流程,在胜利之后,free() 之后又重新malloc分配了龙的结构体,这时候 在输入名字的时候,我们可以控制4字节。(call eax)
 
也就是:先死亡一次,再利用priest角色的技能使龙加血加到溢出 死亡后有控制4字节的机会,把那4字节填充成system("/bin/sh")的地址,就可以拿到shell了。
 
0x04:怎么操作
 
大概流程:
  1. 故意死亡一次
  2. 选择priest角色  332 的操作3轮
  3. 最后程序会有输入,这时候写入4字节到eax,之后程序会call eax
 
验证漏洞
 
写出exp打远程服务器
 
打一发之后
 
 
 
哈哈哈 搞定了
 
结束语: UAF 挺有意思~ 顺便把pwnable.kr的UAF那个关卡也给秒了~挺简单的 就不写了
 
 

[pwnable.kr]Dragon的更多相关文章

  1. Pwnable.kr

    Dragon —— 堆之 uaf 开始堆的学习之旅. uaf漏洞利用到了堆的管理中fastbin的特性,关于堆的各种分配方式参见堆之*bin理解 在SecretLevel函数中,发现了隐藏的syste ...

  2. pwnable.kr的passcode

    前段时间找到一个练习pwn的网站,pwnable.kr 这里记录其中的passcode的做题过程,给自己加深印象. 废话不多说了,看一下题目, 看到题目,就ssh连接进去,就看到三个文件如下 看了一下 ...

  3. pwnable.kr bof之write up

    这一题与前两题不同,用到了静态调试工具ida 首先题中给出了源码: #include <stdio.h> #include <string.h> #include <st ...

  4. pwnable.kr col之write up

    Daddy told me about cool MD5 hash collision today. I wanna do something like that too! ssh col@pwnab ...

  5. pwnable.kr brainfuck之write up

    I made a simple brain-fuck language emulation program written in C. The [ ] commands are not impleme ...

  6. pwnable.kr login之write up

    main函数如下: auth函数如下: 程序的流程如下: 输入Authenticate值,并base64解码,将解码的值代入md5_auth函数中 mad5_auth()生成其MD5值并与f87cd6 ...

  7. pwnable.kr详细通关秘籍(二)

    i春秋作家:W1ngs 原文来自:pwnable.kr详细通关秘籍(二) 0x00 input 首先看一下代码: 可以看到程序总共有五步,全部都满足了才可以得到flag,那我们就一步一步来看 这道题考 ...

  8. pwnable.kr simple login writeup

    这道题是pwnable.kr Rookiss部分的simple login,需要我们去覆盖程序的ebp,eip,esp去改变程序的执行流程   主要逻辑是输入一个字符串,base64解码后看是否与题目 ...

  9. pwnable.kr第二天

    3.bof 这题就是简单的数组越界覆盖,直接用gdb 调试出偏移就ok from pwn import * context.log_level='debug' payload='A'*52+p32(0 ...

随机推荐

  1. python学习笔记四 (运算符重载和命名空间、类)

    从以上代码中应该了解到: obj.attribute  查找的顺序: 从对象,类组成的树中,从下到上,从左到右到查找最近到attribute属性值,因为rec中存在name的属性,所以x.name可以 ...

  2. vue组件添加事件@click.native

    1,给vue组件绑定事件时候,必须加上native ,否则会认为监听的是来自Item组件自定义的事件 2,等同于在子组件中:  子组件内部处理click事件然后向外发送click事件:$emit(&q ...

  3. Spring Boot 五种热部署方式,极速开发就是生产力!

    1.模板热部署 在 Spring Boot 中,模板引擎的页面默认是开启缓存的,如果修改了页面的内容,则刷新页面是得不到修改后的页面的,因此我们可以在application.properties中关闭 ...

  4. .Net Core使用AutoMapper做对象关系映射

    我想很多后端开发者,纠结于如何在Dto及表实体中做属性关系映射,因为真的太繁琐了., ⒈如何使用? Mapper.Initialize(cfg => cfg.CreateMap<Users ...

  5. 详解EveryThing

    摘要:Everything几乎是每个职场人必备的效率工具,但同事们都只用它的一两个基本功能,并没有发挥出该软件的真正效率.实际上,把Everything的功能用到极致能够成倍的提升我们的工作效率,本文 ...

  6. echarts属性的设置

    // 全图默认背景  // backgroundColor: ‘rgba(0,0,0,0)’, // 默认色板 color: ['#ff7f50','#87cefa','#da70d6','#32cd ...

  7. C# 过滤字典中的数据 并将过滤后的数据转成新的字典对象

    Dictionary<string, object> dic = new Dictionary<string, object>(); dic.Add("); dic. ...

  8. 框架之一:mybatis

    同时加载驱动包 mysql+mybatis 创建bean对应的mapper接口bookMapper package com.imu.mzw.mapper; import java.util.List; ...

  9. 一、PHP和Apache实现多用户自助建站

    一.环境搭建准备

  10. Mandelbrot集合及其渲染

    什么是Mandelbrot集合? Mandelbrot集合是在复数平面上组成分形的点的集合,它正是以数学家Mandelbrot命名. Mandelbrot集合可以用复二次多项式 \[ f_c(z)=z ...