【2024】H&NCTF
WebPlease_RCE_Me
GET传参输入?moran=flag,之后获取源码:
123456789101112131415<?phpif($_GET['moran'] === 'flag'){ highlight_file(__FILE__); if(isset($_POST['task'])&&isset($_POST['flag'])){ $str1 = $_POST['task']; $str2 = $_POST['flag']; if(preg_match('/system|eval|assert|call|create|preg|sort|{|}|filter|exec|passthru|proc|open|echo|`| |\.|include|require|flag/i',$str1) || strl ...
【2024】高校网络安全管理运维赛
比赛时间:2024-05-06
Re-easyre 基本的base64换表,用CyberChef解密
Re-babyre进入主函数,发现输入四次 看一下就知道是大数求解(当初写的时候差不多 不知道为什么第四个总是算错…)
1234567891011121314151617181920212223242526272829303132333435363738394041from z3 import *s = Solver() # 设置一个解方程的类Solver(必须要设置)v5=BitVec('v5',32)v6=BitVec('v6',32)v7=BitVec('v7',32)v8=BitVec('v8',32)s.add(v5 + 1380855784 == 907301700)s.add((v6 | 0x8E03BEC3) - 3 * (v6 & 0x71FC413C) + v6 == -1876131848)s.add(v7<=0x10000000)s.add(4 * ((~v7 &am ...
无参数RCE的一些奇技淫巧
简述: 首先说一下什么是无参数RCE,对于很多时候,我们通常遇到PHP中存在eval函数的时候,一般是通过构造:
1system("cat /flag");
的payload来实行攻击的,大不了就出现了一些waf需要绕过。但是,有的时候,他们相关的waf特别奇葩,像是过滤了所有的字母以及数字什么的,另外,就是这篇博客最主要说明的题目,就是无参数RCE:
像是下面的这一个正则:
123if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['star'])) { eval($_GET['star']);}
经过了它的过滤之后,最后只有a(b(c())); 这样的payload才不会被过滤了。
正则表达式 [^\W]+((?R)?) 匹配了一个或多个非标点符号字符(表示函数名),后跟一个括号(表示函数调用)。其中 (?R) 是递归引用,它只能匹配和替换嵌套的函数调用 ...
pwn学习笔记(7)--堆相关源码
相关源码:1. chunk 相关源码: 对于用户来说,只需要确保malloc()函数返回的内存不会发生溢出,并且在不用的时候使用free() 函数将其释放,以后也不再做任何操作即可。而对于glibc来说’它要在用户第一次调用malloc()函数之前对堆进行初始化;在用户频繁申请和释放时维护堆的结构’保证时间和空间上的效率;同时还要检测过程中可能产生的错误,并及时终止程序。
首先,先稍微说下几个相关的宏定义。
request2size():1234567#define request2size(req) \(((req) + SIZE_SZ + MALLOC_ALIGN_MASK < MTNSIZE) ? \MINSIZE : \((req) + SIZE_SZ + MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK )#define MALLOC_ALIGN_MASK (MALLOC_ALIGNMENT - 1)#define MALLOC_ALIGNMENT (2 * SIZE_SZ)
...
pwn学习笔记(6)--堆基础概述
glibc堆概述:1.内存管理与堆:概述: 内存管理是堆计算机的内存资源进行管理,这要求在程序请求时能够动态分配内存的一部分,并在程序不需要时释放分配的内存。CTF竞赛中常见的ptmalloc2就是glibc实现的内存管理机制,它继承了dlmalloc,并提供了对多线程的支持。
堆是程序虚拟内存中由低地址向高地址增长的线性区域。一般只有当用户向操作系统申请内存时,这片区域才会被内核分配出来,并且处于效率和页对齐的考虑,通常会分配相当大的连续内存。程序再次申请时便会从这片内存中分配,直到堆空间不能满足时才会再次增长。堆的位置一般在BSS段高地址处。
brk()和sbrk(): 堆的属性是可读可写的,大小通过brk()和sbrk()函数进行控制。在堆未初始化时,program_break指向BSS段的末尾,通过调用brk()和sbrk()来移动program_break使得堆增长。在堆初始化时,如果开启了ASLR,则堆的起始地址start_brk会在BSS段之后的随机位移出,如果没有开启,则start_brk会紧接着BSS段。
两个函数相关内容如下:
123#include & ...
pwn学习笔记(5)--格式化字符串漏洞(未完全完成)
pwn学习笔记(5)–格式化字符串漏洞 前言:由于条件有限,因此对于该漏洞的学习不算很多,
格式化字符串漏洞基础:格式化字符串介绍: 格式化字符串函数可以接收可变数量的参数,并将第一个参数作为格式化字符串,根据其来解析之后的参数,格式化字符串的利用一般分为三个部分:
格式化字符串函数
格式化字符串
[后续参数]
格式化字符串函数: 常见的格式化字符串有:
输入:
scanf()
输出:
函数
基本介绍
printf
输出到 stdout
fprintf
输出到指定 FILE 流
vprintf
根据参数列表格式化输出到 stdout
vfprintf
根据参数列表格式化输出到指定 FILE 流
sprintf
输出到字符串
snprintf
输出指定字节数到字符串
vsprintf
根据参数列表格式化输出到字符串
vsnprintf
根据参数列表格式化输出指定字节到字符串
setproctitle
设置 argv
syslog
输出日志
格式化字符串的格式:1%[parameter][flags][field ...
SQL无列名注入
SQL无列名注入 前段时间,队里某位大佬发了一个关于sql注入无列名的文章,感觉好像很有用,特地研究下。
关于 information_schema 数据库: 对于这一个库,我所知晓的内容并不多,并且之前总结SQL注入的时候忘记说这个数据库了,在这里补充一下,简单点儿来说,就是这个数据库中的某些表存放着数据库的一些信息,例如,我电脑中所有的数据库中存在如下的几个数据库:
12345678910111213mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || mysql || performance_schema || sakila || sys || test || world |+--------------------+7 rows in set (0.00 sec)
...
pwn学习笔记(4)ret2libc
pwn学习笔记(4)静态链接: 静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。这里的库指的是静态链接库,Windows下以.lib为后缀,Linux下以.a为后缀。
也就是说将静态链接库中的所有的函数都写入这个ELF文件中,所以会造成该二进制文件极为庞大,因此也会存在很多的可供利用来ret2syscall的gadgets。但是,使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费。
对于ret2syscall而言,我们能够在程序中找到众多的可以给我们利用的gadgets,主要是因为二进制程序是静态链接程序,正因为如此,存在众多的gadgets,给我们构造系统调用。
动态链接:1.简述: 动态链接(Dynamic Linking),把链接这个过程推迟到了运行时再进行,在可执行文件装载时或运行时,由操作系统的装载程序加载库。这里的库指的是动态链接库,Windows下以.dll为后缀,Linux下以.so为后缀。
动态链接可以大规模减小ELF文件的 ...
pwn学习笔记(3)ret2syscall
pwn学习笔记(3)ROP原理: ROP(Return Oriented Programming)返回导向编程,主要思想是通过在程序中已有的小片段(gadgets)来改变某些寄存器或者变量的值,从而控制程序的执行流程。
栈溢出–ret2syscall:1.系统调用: 对于一个已经存在于标准库中的函数,例如printf(),我们编写某个程序的时候,这个函数仅仅只用了printf(参数);这么一行,但是,其工作可是很复杂的,printf()调用了函数库当中的其他更加底层的函数,然后被调用的函数肯定会调用再底层的函数,知道调用到系统调用中的write()函数为止;由上可知,任何一个函数想要完成某样工作,都必须要经过系统调用来操作硬件才能够成功。
在Linux中,系统调用通常通过int 80h 这一汇编代码实现,int表示的是终端,interrupt,80h则是代指的系统调用的终端符号,当程序执行到int 80h这一代码的时候,就会将相应的通用寄存器eax中的参数作为系统调用的调用号,其他寄存器中的值或者地址所指向的值作为参数,例如:
1execve("/bin/sh&quo ...
Pwn学习笔记(2)--ret_2_text_or_shellcode
pwn学习笔记(2)1.三种常见的寄存器: ax寄存器:通用寄存器,可用于存放多种数据
bp寄存器:存放的是栈帧的栈底地址
sp寄存器:存放的是栈顶的地址
2.栈帧与栈工作的简介: 栈帧是存储函数的一些信息的地方,栈帧存储有函数的局部变量,传递给子函数的实际参数,父函数的地址以及上一个栈帧栈底的地址,大致情况如下:
在函数调用的过程中,首先会讲bp寄存器的值进行压栈,以方便在恢复的时候恢复栈底寄存器的值,再之后,会按顺序将局部变量压栈,最后是子函数的实际参数,会按照先入栈的后出栈,从最后一个实际参数先入栈再到第一个实际参数,比如函数a(int a , int b),压栈的方式就是先压栈b的实际参数,再压栈a的实际参数,当这些压栈完成之后,就可以压栈父函数调用子函数的那条语句的下一条语句的地址,紧接着,可以压栈当前栈帧的栈底地址了。
具体的汇编语言实现就不多做解释了,因为我这里只是简述。
3.缓冲区溢出漏洞: 缓冲区溢出楼哦对那个的本质就是向定长的缓冲区中写入了超长的数据,造成了写入的数据覆盖了其他合法的内存区域。
4.栈溢出之–ret2text:(1)原理: ...