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

安恒安全培训实习生,CTF方向面试题!

目均模拟真实CTF赛题,需结合动态调试与工具链(pwntools/ROPgadget/one_gadget)完成利用。

覆盖栈、堆、格式化字符串、高级堆利用、沙箱逃逸五大方向,从基础ROP到House of Apple,逐步提升对抗防护的能力。

题目1:栈溢出+ROP绕过NX与Canary

名称babyrop
描述:目标程序是一个64位ELF文件,存在栈溢出漏洞,但开启了NX和Canary保护。请获取远程服务器的shell。
考察点:Canary泄露、ROP链构造、基础栈溢出利用。
解答步骤

  1. 漏洞分析
    • 逆向发现程序在读取输入时使用gets函数,导致栈溢出。

    • 输入长度超过缓冲区后,可以覆盖Canary和返回地址。

  2. 利用思路
    • 通过溢出泄露Canary值,绕过栈保护。

    • 构造ROP链调用system("/bin/sh")绕过NX。

  3. EXP关键代码
    from pwn import *
    p = process('./babyrop')
    payload = b'A'*offset_canary + p64(canary) + b'A'*8 + rop_chain
    p.sendline(payload)
    p.interactive()
    

详细解答

  • 使用%p格式字符串泄露Canary(或通过逐字节爆破)。

  • 利用ROPgadget查找pop rdi; retsystem地址,拼接ROP链。

题目2:堆溢出+Unlink攻击

名称heap_unlink
描述:一个32位程序存在堆溢出漏洞,允许覆盖相邻堆块的size字段,触发Unlink攻击。
考察点:堆布局、Unlink利用、伪造堆块结构。
解答步骤

  1. 漏洞分析
    • 输入数据时未检查长度,导致堆溢出,可覆盖下一个堆块的prev_sizesize字段。

  2. 利用思路
    • 伪造一个空闲堆块,通过Unlink操作实现任意地址写。

    • 覆盖free@gotsystem地址,触发free("/bin/sh")

  3. EXP构造
    # 伪造堆块结构
    fake_chunk = p32(0xdeadbeef) + p32(heap_addr - 12)  # fd/bk指针
    payload = b'A'*overflow_size + p32(0x80) + p32(0x88 | 0x1) + fake_chunk
    

详细解答

  • 通过溢出修改sizePREV_INUSE位,触发合并操作。

  • 利用Unlink的FD->bk = BKBK->fd = FD实现任意地址写入。

题目3:格式化字符串+栈迁移

名称fmt_stack_pivot
描述:程序存在格式化字符串漏洞和栈溢出漏洞,但溢出空间不足,需结合栈迁移技术完成利用。
考察点:格式化字符串泄露、栈迁移(Stack Pivot)、ROP链构造。
解答步骤

  1. 漏洞分析
    • 使用printf(user_input)导致格式化字符串泄露libc地址。

    • 栈溢出长度不足以覆盖返回地址,但可覆盖rbp

  2. 利用思路
    • 泄露栈地址和libc基址。

    • 覆盖rbp为可控内存地址,通过leave; ret指令实现栈迁移。

  3. EXP关键代码
    payload = fmtstr_payload(offset, {printf_got: system_addr})  # 格式化字符串覆盖GOT表
    payload += p64(migrated_stack_addr)  # 覆盖rbp
    

详细解答

  • 利用%nrbp位置写入目标地址。

  • 迁移后在新栈布置ROP链调用system("/bin/sh")

题目4:Use After Free + Fastbin Attack

名称uaf_fastbin
描述:程序在释放堆块后未清空指针,可通过UAF修改fd指针,实现任意地址分配。
考察点:UAF漏洞利用、Fastbin Attack、内存布局。
解答步骤

  1. 漏洞分析
    • 释放堆块后仍能使用悬垂指针修改其fd值。

  2. 利用思路
    • 修改fd指向伪造的Fastbin链,分配堆块到__malloc_hook附近。

    • 覆盖__malloc_hookone_gadget地址。

  3. EXP构造
    # 分配并释放堆块A
    free(A)
    # 通过UAF修改A的fd为fake_addr
    edit(A, p64(fake_addr))
    # 再次分配两次,第二次得到fake_addr处的堆块
    

详细解答

  • 计算__malloc_hook附近的可用地址(如利用0x7f对齐特性)。

  • 使用one_gadget工具查找可直接触发shell的gadget。

题目5:高级堆利用+沙箱逃逸

名称house_of_apple
描述:程序开启沙箱(禁用execve),需通过堆漏洞构造ORW链读取flag文件。
考察点:House of系列利用、沙箱逃逸、SROP(Sigreturn-Oriented Programming)。
解答步骤

  1. 漏洞分析
    • 存在任意地址写漏洞,可劫持_IO_list_all指针。

    • 沙箱限制只能使用open/read/write系统调用。

  2. 利用思路
    • 伪造_IO_FILE结构体,触发_IO_flush_all_lockp中的函数调用链。

    • 构造ROP链调用open("flag")read(fd, buf, 0x100)write(1, buf, 0x100)

  3. EXP关键代码
    # 伪造_IO_FILE结构
    fake_file = p64(0) * 18 + p64(0) + p64(1) + p64(0xffffffff) + p64(rop_chain_addr)
    

详细解答

  • 利用House of Apple技术劫持程序流至ROP链。

  • 通过syscall; retgadget拼接ORW链。

相关文章:

  • crashpad 编译
  • MacOS 安装 cocoapods
  • 解读 AI绘画工作流ComfyUI Stable Diffusion
  • react中封装一个预览.doc和.docx文件的组件
  • TCP三次握手、四次挥手+多线程并发处理
  • ceph存储原理
  • 【UE5】“对不起,您的客户端未能传递登录所需的参数”解决办法
  • Linux Quota 显示空间占用远大于实际数据的问题排查记录
  • 01 mysql 安装(Windows)
  • 32单片机——独立看门狗
  • 算法基础学习|03整数二分
  • 如何编制研发部门绩效考核制度
  • 删除k8s某命名空间,一直卡住了怎么办?
  • java之Integer、Double自动拆装箱比较,踩坑值int和Integer比较之空指针异常
  • 垒球世界纪录多少米·棒球1号位
  • 三格电子上新了——超高频RFID读写器
  • 2025最新福昕PDF编辑器,PDF万能处理工具
  • PostgreSQL事务与并发清理
  • Electron Forge【实战】自定义菜单 -- 顶部菜单 vs 右键快捷菜单
  • 力扣HOT100——207.课程表
  • 滨江集团:一季度营收225.07亿元,净利润9.75亿元
  • 王毅会见泰国外长玛里:坚决有力打击电诈等跨境犯罪
  • 法治日报调查直播间“杀熟”乱象:熟客越买越贵,举证难维权不易
  • 北京朝阳涉住宅组团地块126亿元成交
  • 观察|英国航母再次部署印太,“高桅行动”也是“高危行动”
  • 艺术与医学的对话,瑞金医院办了一个展览