GPG 命令 创建 gpg key 1 2 3 4 5 6 7 8 9 $ gpg --full-generate-key # 生成 gpg key gpg: directory '/home/ubuntu/.gnupg/openpgp-revocs.d' created gpg: revocation certificate stored as '/home/ubuntu/.gnupg/openpgp-revocs.d/ECA3A621F79A890A23D03ED5D5634A568BBCEDC4.rev' public and secret key created and signed. pub ed25519 2024-11-09 [SC] ECA3A621F79A890A23D03ED5D5634A568BBCEDC4 uid test <[email protected]> sub cv25519 2024-11-09 [E] 列出 1 2 3 4 5 6 7 $ gpg --list-key # 简化写法 gpg -k /home/ubuntu/.gnupg/pubring.kbx ------------------------------- pub ed25519 2024-11-09 [SC] ECA3A621F79A890A23D03ED5D5634A568BBCEDC4 uid [ultimate] test <[email protected]> sub cv25519 2024-11-09 [E] 列出所有公钥、子公钥 ...
RISC-V 汇编概览
最近尝试跟着 rCore Tutorial 教程,使用 Rust 实现基于 RISC-V 架构的类 Unix 内核,从而在深化 OS 理解的目标上,同时入门学习 Rust 语言和 RISC-V 基础。虽然说是 RISC-V 比 x86 简单很多,但是直接跟着教程来同时学习 RISC-V 还是有点不够,经常前面记得一点零星的汇编,看到后面的代码就忘了是怎么回事了。所以尝试来整理一下 RISC-V 的汇编,希望能让看到的小伙伴快速的入门一下。本文将以 64 位为例介绍汇编语言。 ...
QEMU堆溢出漏洞----CVE-2015-7504
CVE-2015-7504是QEMU在仿真pcnet网卡中出现的一个堆溢出漏洞,可以溢出四个字节,可以劫持程序的执行流,结合前面的CVE-2015-5165可以实现任意代码执行。但有一个很致命的问题,宿主机内核需要使用CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE 标志进行编译,否则在溢出的四个字节没法成功修改地址(总体八个字节的地址,因此需要高四字节与目标地址一致)。这个编译标志在目前最新的Ubuntu16.04中似乎已经没有了,所以就不进行完整的复现了,仅复现至PoC部分。 PCNET网卡 AMD 的PCNET系列网卡被许多虚拟机或仿真器支持,如QEMU、VMware和VirtualBox。虽然没有RTL8139简易,但它的支持更加广泛,RTL8139只在QEMU中有支持。 网卡有16位和32位两种模式,这取决于DWIO 的值(储存在卡中变量),16位模式是网卡重置之后的默认模式。网卡有两类内部寄存器:CSR(控制和状态寄存器)和BCR(Bus Control Register)。 1 2 3 4 5 6 7 8 9 10 11 12 0 16 +----------------------------------+ | EPROM | +----------------------------------+ | RDP - Data reg for CSR | +----------------------------------+ | RAP - Index reg for CSR and BCR | +----------------------------------+ | Reset reg | +----------------------------------+ | BDP - Data reg for BCR | +----------------------------------+ ...
QEMU信息泄露漏洞分析与利用----CVE-2015-5165
参考大佬们的文章复现CVE-2015-5165。 环境搭建 宿主机环境 Ubuntu 20.10 QEMU编译 QEMU commit-bd80b59源码下载。 1 2 3 4 5 6 $ unzip qemu.zip $ mkdir -p bin/debug/native $ cd bin/debug/native $ sudo apt-get install zlib1g-dev libglib2.0-dev libpixman-1-dev $ ../../../configure --target-list=x86_64-softmmu --enable-debug --disable-werror $ make 如果出现以下错误,给文件 commands-posix.c 增加头文件 <sys/sysmacros.h> 即可解决。 1 2 3 /usr/bin/ld: qga/commands-posix.o: in function `dev_major_minor': /repo/qemu/qga/commands-posix.c:640: undefined reference to `major' /usr/bin/ld: /repo/qemu/qga/commands-posix.c:641: undefined reference to `minor' 制作QEMU虚拟机 这里我使用的Ubuntu 16.04 Server i386作为QEMU客户机系统。点击下载。 还需要下载安装VNC-Viewer,稍后会用到。链接。 1 2 3 4 5 6 $ ./qemu-img create -f qcow2 ~/tmp/vm/ubuntu.img 10G $ sudo dpkg -i VNC-Viewer-6.20.529-Linux-x64.deb $ x86_64-softmmu/qemu-system-x86_64 -boot d -cdrom \ # 能用嵌套虚拟就用(添加--enable-kvm) ~/tmp/iso/ubuntu-16.04.6-server-i386.iso \ -hda ~/tmp/vm/ubuntu.img -m 1024 $ vncviewer host:port # 连接上,安装就好 (尽量使用–enable-kvm,否则卡的受不了,安装系统安了四五个小时。。。) ...
HITB GSEC 2017:babyqemu
题目下载地址:babyqemu.tar.gz 分析 tar xvzf babyqemu.tar.gz解压看到启动脚本launch.sh 1 2 3 4 5 6 7 8 9 10 #! /bin/sh ./qemu-system-x86_64 \ -initrd ./rootfs.cpio \ -kernel ./vmlinuz-4.8.0-52-generic \ -append 'console=ttyS0 root=/dev/ram oops=panic panic=1' \ -enable-kvm \ # 需要CPU virtualization,现在与hyper-v共存的VMware不支持此选项。可以删掉 -monitor /dev/null \ -m 64M --nographic -L ./dependency/usr/local/share/qemu \ -L pc-bios \ -device hitb,id=vda 在最后一行可以看到设备名称为hitb,在ida左侧Functions window,ctrl+f搜索hitb就可以找到相关函数。通过在ida的Local Types窗口搜索hitb可以找到HitbState结构体,其中还包含dma_state结构体。 ...
【翻译】Virtio:一种Linux I/O虚拟化框架
首发于安全客Virtio:一种Linux I/O虚拟化框架 - 安全客,安全资讯平台 (anquanke.com) 原文:Virtio: An I/O virtualization framework for Linux – IBM Developer 学习Virtio推荐首先看这一篇,国内好多文章写的太乱了,看来看不去都不明白整体的架构,给人很模糊的感觉。这篇文章好很多。 受限于个人水平,翻译肯定有不妥之处,译注根据自己的理解加入,也不一定准确。如有错误,还请不吝指出。 简言之,virtio是设备和半虚拟化管理程序(paravirtualized hypervisor)之间的一个抽象层。virtio是Rusty Russell为了支持他自己的虚拟化方案lguest而开发的。这篇文章以对半虚拟化和设备仿真的介绍开始,然后探寻virtio中的一些细节。采用kernel 2.6.30版本的virtio框架进行讲解。 Linux是hypervisor的“游乐场”。正如我在文章使用Linux作为hypervisor中所展现的,Linux提供了许多具有不同特性和优势的虚拟化解决方案。例如KVM(Kernel-based Virtual Machine),lguest、和用户态的Linux。在Linux使用这些虚拟化解决方案给操作系统造成了重担,因为它们各自都有独立的需求。其中一个问题就是设备的虚拟化。virtio为各种各样设备(如:网络设备、块设备等等)的虚拟提供了通用的标准化前端接口,增加了各个虚拟化平台的代码复用。而不是各自为政般的使用繁杂的设备虚拟机制。 全虚拟化 vs. 半虚拟化 我们先来讨论两种完全不同的虚拟化方案:全虚拟化和半虚拟化。在全虚拟化中,客户操作系统在hypervisor上运行,相当于运行于裸机一般。客户机不知道它在虚拟机还是物理机中运行,不需要修改操作系统就可以直接运行。与此相反的是,在半虚拟化中,客户机操作系统不仅能够知道其运行于虚拟机之上,也必须包含与hypervisor进行交互的代码。但是能够在客户机和hypervisor的切换中,带来更高的效率(图1)。 译注:客户机与hypervisor的切换举例:客户机请求I/O,需要hypervisor中所虚拟的设备来响应请求,此时就会发生切换。 在全虚拟化中,hypervisor必须仿真设备硬件,也就是说模仿硬件最底层的会话(如:网卡驱动)。尽管这种仿真看起来方便,但代价是极低的效率和高度的复杂性。在半虚拟化中,客户机与hypervisor可以共同合作让这种仿真具有更高的效率。半虚拟化不足就是客户机操作系统会意识到它运行于虚拟机之中,而且需要对客户机操作系统做出一定的修改。 ...
Qemu Escape ---- 以BlizzardCTF2017_STRNG为例
最近想学一下qemu escape的基础知识,进而分析一些Qemu的CVE漏洞。 本文主要参考raycp师傅的两篇文章。[1] [2] Qemu概述 每个运行的qemu虚拟机对应于host上的一个进程,虚拟机的执行线程(如CPU线程、I/O线程等)对应于qemu进程中的一个线程。 qemu的内存结构,根据QEMU Case Study,虚拟机对应的内存结构为如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Guest' processes +--------------------+ Virtual addr space | | +--------------------+ | | \__ Page Table \__ \ \ | | Guest kernel +----+--------------------+----------------+ Guest's phy. memory | | | | +----+--------------------+----------------+ | | \__ \__ \ \ | QEMU process | +----+------------------------------------------+ Virtual addr space | | | +----+------------------------------------------+ | | \__ Page Table \__ \ \ | | +----+-----------------------------------------------++ Physical memory | | || +----+-----------------------------------------------++ ...
Kernel Pwn: 从入门到入土
MISC 内核文件区别 vmlinux 是静态链接的可执行文件,未压缩的内核,最原始的文件,可以用来调试。 vmlinuz 是可引导的、压缩的内核。没有调试信息等数据,不可用于调试。启动时会自解压,通常会显示以下信息 1 2 Decompressing Linux... done Booting the kernel. zImage 是经过压缩的小内核(小于512KB)。 bzImage 是经过压缩的大内核(大于512KB)。 Initial Ramdisk 名字类似initramfs.cpio 文件,一般可以使用cpio读取其中的文件。 1 2 $ find . | cpio -o --format=newc > initramfs.cpio # compress $ sudo cpio -idmv < initramfs.cpio # depress 有时也经过了gzip的压缩。 1 2 3 $ mv initramfs.cpio initramfs.cpio.gz $ gunzip initramfs.cpio.gz # 解压得到initramfs.cpio $ cpio -idmv < initramfs.cpio 更改为正确的后缀之后,图形界面“归档管理器”也可以打开。 ...
Arm Pwn
环境配置 1 $ sudo apt install qemu-user gdb-multiarch 安装完成后就可以运行平台上的静态链接文件了,会自动调用qemu执行。 动态链接程序 对于动态链接的程序,还需要安装跨平台的lib。 1 $ apt-cache search "libc" | grep arm 安装类似libc6-ARCH-cross。 动态链接库被安装在类似/usr/arm-linux-gnueabihf/的路径。qemu不知道动态链接的位置,它预期在类似/etc/qemu-binfmt/arm的路径,所以可以设置软链接来避免用-L来指定链接库位置。 1 2 3 $ sudo mkdir /etc/qemu-binfmt $ sudo ln -s /usr/arm-linux-gnueabihf /etc/qemu-binfmt/arm $ sudo ln -s /usr/aarch64-linux-gnu/ /etc/qemu-binfmt/aarch64 # 对于aarch64 ...
pwnable.tw re-alloc_revenge
题目分析 防护比re-alloc多了FULL RELRO和PIE。其他没有改变。 总体思路 程序没有show函数,所以通过修改stdout的方式泄露libc。 将一个chunk同时释放到tcache和unsorted bin,partial overwrite fd部分,指向stdout,需要爆破4bit。取得stdout后修改进行泄露。 最后修改__realloc_hook为one_gadget得到shell。 主要难点在布局构造。 ...