Linux全虚拟机网络
桥接模型KVM 客户机网络连接有两种方式: 用户网络(User Networking):让虚拟机访问主机、互联网或本地网络上的资源的简单方法,但是不能从网络或其他的客户机访问客户机,性能上也需要大的调整。NAT方式。 虚拟网桥(Virtual Bridge):这种方式要比用户网络复杂一些,但是设置好后客户机与互联网,客户机与主机之间的通信都很容易。Bridge方式。 Bridge方式即虚拟网桥的网络连接方式,是客户机和子网里面的机器能够互相通信。可以使虚拟机成为网络中具有独立IP的主机。桥接网络(也叫物理设备共享)被用作把一个物理设备复制到一台虚拟机。网桥多用作高级设置,特别是主机多个网络接口的情况。 在Linux中的虚拟机的网卡都包含前半段和后半段,前半段在虚拟机上,后半段在宿主机上。上图eth0为虚拟机上的网卡,对应的后半段为vnet0,vnet0为tap设备。在虚拟机上所有发往eth0的数据就直接发往vnet0了,也可以将vnet0看作一块网卡。 在宿主机中创建一个桥设备,把宿主机的eth0放在桥上,这样虚拟机上的eth0将报文发给vnet0,再直接发给宿主机上的eth0,将源地 ...
网卡和网关
网卡在 Ubuntu(以及其他操作系统)中,网卡(网络接口卡,NIC)是一个关键的硬件组件,用于计算机与网络(如局域网、互联网)之间进行数据通信。网卡的主要功能是通过有线或无线的方式,将数据包发送和接收至其他设备或网络。 网卡在 Ubuntu 中的作用 连接网络:网卡是连接网络的物理设备,无论是通过以太网电缆(有线网卡)还是通过 Wi-Fi 信号(无线网卡),网卡都是数据进入和离开计算机的路径。它允许 Ubuntu 系统访问互联网或本地网络(例如家用网络或公司网络)。 数据传输:网卡负责数据的发送和接收。它将操作系统发送的数据转换成网络信号,并通过网络介质(如网线或无线信号)发送出去;同时,它也接收来自网络的信号并将其转换成计算机可以处理的数据格式。 管理网络连接:在 Ubuntu 中,可以使用多种工具(如 NetworkManager、ifconfig、ip 命令等)来管理网卡的配置和设置。例如,你可以配置 IP 地址、子网掩码、网关、DNS 服务器等,以确保网络连接正常工作。 网络共享和路由:Ubuntu 系统中的网卡也可以用来设置网络共享或作为路由设备。例如,你可以配置 U ...
tenda_2018-16333栈溢出漏洞复现
这是真正意义上第一次复现IOT漏洞,也是参考了许多大佬的博客,算是“站在巨人的肩膀上”进行入门学习了。 固件获取固件地址:pwn/IOT/Tenda_CVE-2018-16333 at master · Snowleopard-bin/pwn (github.com) 这里有poc和固件。 漏洞分析前期处理首先是使用binwalk提取固件。 binwalk -Me US_AC15V1.0BR_V15.03.05.19_multi_TD01.bin --run-as=root 根据官方解释进入squashfs-root/bin文件夹下找到了漏洞程序httpd。 这也和做pwn一样,首先要知道漏洞程序才能做接下来的分析,只不过pwn题是把漏洞程序直接给我们了。在这里就需要我们自己去找了,目前我还不知道如何定位这样的程序,等以后深入了解慢慢积累吧 : ) 然后我们看看程序开启了什么保护机制:这里是只开了NX保护,并且程序是arm架构下的32位程序。 ❯ checksec httpd[*] 'squashfs-root/bin/httpd' ...
除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在  32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度内完成此题。 示例 1: 输入: nums = [1,2,3,4]输出: [24,12,8,6] 示例 2: 输入: nums = [-1,1,0,-3,3]输出: [0,0,9,0,0] 思路开一个数组,第一个循环跑一遍前缀乘积,第二次循环得出结果。 func productExceptSelf(nums []int) []int { n := len(nums) ans := make([]int,n) ans[0] = 1 for i:=1; i < n; i++{ ans[i] = nums[i-1]*ans[i-1] } right := nums[n-1] for i:=n-2; ...
修改stack_check_fail的got表
分析题目地址:[[HZNUCTF 2023 final]fibonacci | NSSCTF] ❯ checksec pwn[*] '/home/za/pwn' Arch: amd64-64-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x3fe000) SHSTK: Enabled IBT: Enabled Stripped: No Debuginfo: Yes idx未检查负数溢出,同时strlen可以\x00绕过。scanf("%s")可以栈溢出。 思路 修改__stack_chk_fail@got为puts@plt,或者直接改为ret地址 栈溢出 expfrom pwn import *from pwn import p64,u64,p32,u32,p8from LibcSea ...
并发的Clock服务
需求修改clock2来支持传入参数作为端口号,然后写一个clockwall的程序,这个程序可以同时与多个clock服务器通信,从多个服务器中读取时间,并且在一个表格中一次显示所有服务器传回的结果,类似于你在某些办公室里看到的时钟墙。如果你有地理学上分布式的服务器可以用的话,让这些服务器跑在不同的机器上面;或者在同一台机器上跑多个不同的实例,这些实例监听不同的端口,假装自己在不同的时区。像下面这样: $ TZ=US/Eastern ./clock2 -port 8010 &$ TZ=Asia/Tokyo ./clock2 -port 8020 &$ TZ=Europe/London ./clock2 -port 8030 &$ clockwall NewYork=localhost:8010 Tokyo=localhost:8020 London=localhost:8030 实现 go语言tcp包 并发编程 waitgroup 服务端package main import ( "flag" " ...
IDA动态调试
调试命令 ida快捷键 功能 F7 单步步进 F8 单步步过 F9 继续运行程序 F4 运行到光标所在行 Ctrl + F7 直到该函数返回时才停止 Ctrl + F2 终止一个正在运行的进程 F2 设置断点
house_of_cat强网杯
IDA调试这里需要满足一定条件才能进入菜单,所以我使用IDA动态调试,这样可以加快逆向速度,最终确定字符串为:LOGIN | r00t QWBaaaaaadminQWXF和b"mew mew mew~~~~~~", b"CAT | r00t QWBaaaaa" + p32(0xffffffff) + b"$QWXF" 注意事项 在沙箱中限制了 fd 的,所以在orw rop链中需要先close文件描述符0,然后再open flag,这样flag的文件描述符就为0。同时后面read也要以0作为文件描述符。 程序主函数不能正常返回退出,同时没有exit让我们使用FSOP,所以我们不能使用apple,就需要使用cat,利用malloc assert触发。 程序只有两次edit,所以两次large bin attack,第一次用来修改stderr,第二次修改top chunk size,这里是修改了top chunk size + 3的地方,加其他偏移会出错 expfrom pwn import *from pwn imp ...
vsyscall滑动绕过pie
原理适用条件:ubuntu16 偏有宸机:由于一般的系统调用如果想要向内核传递一些参数的话,为了保证用户态和内核态的数据隔离,往往需要把当前寄存器状态先保存好,然后再切换到内核态,当执行完后还需要在会恢复寄存器状态,而这中间就会产生大量的系统开销。因此为了解决这个问题,linux系统会将仅从内核里读取数据的syscall单独列出来进行优化,如 gettimeofday、time、getcpu。 vsyscall的地址是固定的,也就是0xffffffffff600000. 使用如果栈上有一个我们需要返回到的地址,我们只需要用vsyscall将他前面的栈数据填满,程序就会滑动到这个地址去执行函数。特别是system("/bin/sh"). 或者在开启了pie情况下,该地址与后门函数地址只有后面1个字节不一样,那就在用vsyscall将他前面的栈数据填满的前提下,将后一个字节填充为后门函数绕过pie。 如果是两个字节不一样,这就需要爆破一位,有1/16几率成功(比较高。 例题❯ checksec pwn[*] '/home/za/pwn' ...
c++异常处理绕过canary
基础知识感谢这位师傅的博客,然我茅塞顿开!! 原理c++中当某个函数throw某个exception时,程序便会从当前函数开始向上回溯调用链,直到找到匹配的catch,执行完catch后,便会接着在catch所在函数继续执行。 结论异常处理本身存在一些问题,并且使得canary这样的栈保护机制无效。因为异常抛出后的代码不会执行,自然也不会检测canary,自然也不会调用stack_check_fail(). 在此基础上我们发现了一些控制程序流的方式: 通过覆盖rbp,进而控制程序流走向。当然前提是栈帧的确使用rbp存储,因为一些情况下程序只依靠rsp增减。 通过覆盖ret地址,使异常被另外一个handler处理 在某些情况下还可以通过伪造覆盖类虚表的手法,使其在cleanup handler执行析构函数的时候劫持程序流(本文不做详细分析) 覆盖ret地址后,就会去执行ret地址的handler函数。前提是这个handler函数要能够匹配这样的异常。 例题羊城杯2024 logger ❯ checksec pwn[*] '/home/yang/pwn' Ar ...
pwn http:JarvisOJ HTTP
前置知识 popen()函数:开启新进程执行linux命令 htons()函数:程序监听端口 漏洞分析为了便于分析,我已经将相关函数重命令了。 主函数:标准的socket交互流程,在while循环中的handle函数中处理用户输入 void __fastcall __noreturn main(int a1, char **a2, char **a3){ struct sockaddr s; // [rsp+0h] [rbp-20h] BYREF __pid_t v4; // [rsp+14h] [rbp-Ch] int v5; // [rsp+18h] [rbp-8h] int fd; // [rsp+1Ch] [rbp-4h] signal(17, (__sighandler_t)handler); fd = socket(2, 1, 0); if ( fd < 0 ) { perror("socket"); exit(-1); } memset(&s, 0, sizeof(s)); ...
利用svcudp_replay实现apple2_orw
手法在apple2前提下,将chunkB调用函数填充为svcudp_replay+26,再调试定位leave ret和orw该写的位置。 例子题目地址:oneday 提取码: Ya0a 漏洞 UAF 只有一次show和edit ROPgadget --binary ~/ctf/tools/glibcallinone/libs/2.34-0ubuntu3_amd64/libc.so.6 --only 'lea|mov|call' | grep 'rdi, r13' 用这个命令去找magic_gadget,其中有0x000000000016cacd : mov rdi, r13 ; call qword ptr [rax + 0x28],注意是rax+0x28,然后gdb调试具体确认即可。 当然,如果有符号表的话,也可以直接在gdb中找到这段汇编: <svcudp_reply+26>: mov rbp,QWORD PTR [rdi+0x48]<svcudp_reply+30>: mov rax,QWORD PTR [rb ...