ARP概述地址解析协议ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含自标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息(只有目标IP才会回复信息,其他的会丢弃)以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
ARP协议的基本功能基本功能:通过目标设备的IP地址,查询目标设备的MAC地址(物理地址),以保证通信的进行。
局限性:仅能在局域网进行。
ARP常用指令arp -a查看缓存中的所有项目
arp -a ip如果有多人网卡,那么使用arp-a加上接口的lP地址,就可以只显示与该接口相关的ARP缓存项目。
ARP断网攻击(仅供研究学习)概述ARP欺骗(英语:ARPspoofing),又称ARP毒化(ARP poisoning,网上上多译为ARP病毒)或ARP攻击,是针对以太网地址解析协议(ARP)的一种攻击技术,通过欺骗局域网内访问者PC的网关MAC地址,使访问者PC错以为攻击者更改 ...
网络安全学习
未读NOP Sled空中操作雪橇(代码滑梯)NOP SledNOP Sled,中文常被形象地称为“空操作雪橇”、“代码滑梯”或“NOP滑板”,是指在一段shellcode之前插入大量连续的NOP指令。
**NOP指令:**即“No Operation”指令,对于x86架构的CPU,其机器码是 0x90。执行该指令时,CPU不会进行任何有效操作,仅仅将程序计数器(EIP/RIP)加一,然后继续执行下一条指令。
攻击者的目标是让程序执行流跳转到我们布置的shellcode上。但由于栈地址随机化(ASLR)等因素,我们往往无法精确预测shellcode的起始地址。NOP Sled就像在shellcode前铺上了一片长长的、平滑的雪橇道。只要程序执行流跳转到这个雪橇道的任何位置,CPU都会顺着这些NOP指令一路“滑行”下去,直到最终“滑进”并执行我们的shellcode。
例题–ctfshow pwn67检查保护32位
加了canary保护栈溢出受阻,没开NX可以在栈上执行shellcode
进主函数
分析之后,他会先泄露一个地址
这个地址是&v1+v2,这个v2是一个[-6 ...
网络安全学习
未读Off-By-One单字节缓冲区溢出漏洞概论严格来说 off-by-one 漏洞是一种特殊的溢出漏洞,off-by-one 指程序向缓冲区中写入时,写入的字节数超过了这个缓冲区本身所申请的字节数并且只越界了一个字节。
原理off-by-one 是指单字节缓冲区溢出,这种漏洞的产生往往与边界验证不严和字符串操作有关,当然也不排除写入的 size 正好就只多了一个字节的情况。其中边界验证不严通常包括
使用循环语句向堆块中写入数据时,循环的次数设置错误(这在 C 语言初学者中很常见)导致多写入了一个字节。
字符串操作不合适
一般来说,单字节溢出被认为是难以利用的,但是因为 Linux 的堆管理机制 ptmalloc 验证的松散性,基于 Linux 堆的 off-by-one 漏洞利用起来并不复杂,并且威力强大。 此外,需要说明的一点是 off-by-one 是可以基于各种缓冲区的,比如栈、bss 段等等,但是堆上(heap based) 的 off-by-one 是 CTF 中比较常见的。我们这里仅讨论堆上的 off-by-one 情况。
利用
溢出字节为可控制任意字节:通过修改大小造成 ...
ORW沙箱逃逸什么是沙箱保护沙箱保护是一种将不受信任或高风险的代码与系统其余部分隔离在受限运行环境中的安全机制,限制该代码可调用的系统调用、访问的文件和网络权限等资源,从而在发生漏洞或恶意行为时把损害控制在小范围内(常见实现有容器/命名空间、seccomp、应用进程级沙箱和虚拟机),以实现最小权限原则并降低系统被攻破的风险。
例题–ctfshow pwn69查保护64位
查沙箱的工具
123sudo apt install gcc ruby-devgem install seccomp-tools
开了沙箱保护,但是开了系统调用号为0,1,2,60的系统调用,也就是可以用ORW
主要逻辑,输入可0x38字节,加上覆盖ebp和返回地址的空间,可以溢出的空间只有0x8字节了
这个函数中发现有jmp rsp,跳到栈顶的意思
0x20字节放不下ORW,这时候看到mmap函数申请了,0x123000地址,有0x1000字节的空间可写可执行
那么写payload引导进0x123000中写入ORW即可
覆盖返回地址为jmp rsp,让rip跳到栈顶后面重新计算栈顶将rip指向0 ...
UAF(use after free)漏洞Double Free(双重释放漏洞)Double Free,即双重释放,是指在程序中对同一块内存使用 free() 函数(在C或C++语言中)释放两次。这种情况通常发生在手动管理内存的编程语言中,如C和C++。当一个动态分配的内存块不再需要时,应该通过调用 free() 函数来释放这块内存。然而,如果这块内存已经被释放过一次,再次尝试释放就会导致“双重释放”的错误。
双重释放形成的原因重复调用 free():对同一个指针两次调用 free(),而没有在第一次释放后将其置为 NULL。12free(ptr);free(ptr); // 双重释放
未置空的指针:释放内存后没有将指针置为 NULL,后续误操作再次释放。123free(ptr);// 没有 ptr = NULL;free(ptr); // 错误
多个指针指向同一块内存:两个指针指向同一块动态分配的内存,分别对其调用 free()。1234int *p1 = malloc(sizeof(int));int *p2 = p1;free(p1);free(p2); // 双重释放
错 ...
网络安全学习
未读Shellcode限制长度不可见字符版本32位(21字节):1\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\xcd\x80
64位(23字节):1\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\x6a\x3b\x58\x99\x0f\x05
可见字符版本32位:1PYIIIIIIIIIIQZVTX30VX4AP0A3HH0A00ABAABTAAQ2AB2BB0BBXP8ACJJIRJTKV8MIPR2FU86M3SLIZG2H6O43SX30586OCRCYBNLIM3QBKXDHS0C0EPVOE22IBNFO3CBH5P0WQCK9KQXMK0AA
64位:1Ph0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001 ...
栈迁移:一种精巧的栈空间操控技术栈迁移是什么?想象一下你的程序正在执行,突然发现当前的“工作台”(栈空间)太小了,放不下需要的工具和数据。这时候,栈迁移就像是为程序搬了个新家——把执行环境整体搬迁到更宽敞的地方,无论是bss段还是栈的其他区域都可以成为新的落脚点。
为什么需要栈迁移?应用场景分析当你遇到这两种情况时,栈迁移就派上用场了:
空间严重不足:溢出的长度只够覆盖ebp,连返回地址都碰不到
刚好但不够用:虽然能覆盖返回地址,但后面的参数区域太短,payload塞不进去
简单来说,就是原来的栈空间不够发挥,需要换个场地大展拳脚。
技术核心理解关键指令栈迁移的魔法主要依靠leave;ret这个指令组合的两次精彩演出。
leave指令分解:
12mov esp, ebp ; 让栈顶指针指向当前栈底pop ebp ; 将栈顶内容弹出到ebp寄存器
这个过程相当于先确定新的工作基准点,然后更新基址指针。
ret指令作用:
1pop eip ; 将栈顶内容作为下一条指令地址
这是程序执行流的转向器,决定了接下来要去哪里。
栈迁移实战解析第一阶段:首先 ...
PWN静态编译
mprotect函数mprotect()函数可以修改调用进程内存页的保护属性,如果调用进程尝试以违反保护属性的方式访问该内存,则内核会发出一个SIGSEGV信号给该进程。#include <sys/mman.h>int mprotect(void *addr, size_t len, int prot);addr:修改保护属性区域的起始地址,addr必须是一个内存页的起始地址,简而言之为页大小(一般是 4KB == 4096字节)整数倍。len:被修改保护属性区域的长度,最好为页大小整数倍。修改区域范围[addr, addr+len-1]。prot:可以取以下几个值,并可以用“|”将几个属性结合起来使用:1)PROT_READ:内存段可读;2)PROT_WRITE:内存段可写;3)PROT_EXEC:内存段可执行;4)PROT_NONE:内存段不可访问。返回值:0;成功,-1;失败(并且errno被设置)1)EACCES:无法设置内存段的保护属性。当通过 mmap(2) 映射一个文件为只读权限时,接着使用 mprotect() ...





_%E7%88%B1%E7%BB%99%E7%BD%91_aigei_com.png)


















