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 ...
网络安全学习
未读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 ...
湾区杯复现odd_canary(one_gadget)解题思路主函数
get_news函数
buf空间为5*8=40也就是0x28字节
这段代码意思是在 输入字节数+1 的地址处写入10 也就是\n换行符
1*(buf + read(0, buf, 0x28uLL)) = 10;
下面直接跟着把puts函数的真实地址给了bss
跟进之后地址在404080
就是在name的32字节缓冲区之后紧接着,printf函数在没接到NULL的时候会一直输出
所以这里会把puts函数的真实地址泄露,从而计算libc
这个函数就是这个作用
下面是vuln函数
这里看似有canary
实则v1=v3之后,后面相当于v3和自己异或返回0,所以这个操作相当于自己绕过了
溢出之后栈中没多少空间了,这里用one_gadget
找到偏移,限制是必须在rbp-0x78这里是可写的
用vmmap查看内存布局
在这个地址之间是可以写入的
将0x404800覆盖为保存的rbp
返回地址填充one_gadget即可
123456789101112131415161718192021高 ...
网络安全学习
未读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 情况。
利用
溢出字节为可控制任意字节:通过修改大小造成 ...
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); // 双重释放
错 ...






