- 博客(26)
- 收藏
- 关注
原创 2025HGAME
3. 扩大read的字节数;如果使用vuln中的read来写orw-rop链空间明显是不够的,需要在bss上写入一个 read-rop增加读入的字节数,再写orw-rop链 3.5:泄露文件描述: 本题基于网络通信,所以输入输出流不再是0,1.而是同一个文件描述,我选择写一个 write-rop爆破fd,再根据这个fd写read-rop与orw-rop. 当尝试fd==4时发现文件可以执行write函数写出. 此时我们可以写入0x100字节,并且我们要在read后加入leave使得栈迁移的链是 完整的.
2025-03-09 12:33:48
399
原创 GHCTF
这里很绕,需要控制r15控制执行流,r13控制rax,还要控制rsi为bss,最后跳转到syscall触发read,将/bin/sh写入bss段,程序流的控制关键汇编是jmp 15和jmp [rsp],r15是即写即用,rsp的更新必须依赖pop指令,所以我们的jmp r15和jmp [rsp]必须交替出现.又同样用相似的手法操作,通过多次位移与拼接,寄存器10(sp)控制栈顶指针,将其指向bss上的函数指针,并对存放后门函数地址的寄存器进行push操作,就可以劫持funcptr了,成功getshell.
2025-03-09 12:29:10
966
原创 unlink公式
首先要在chunk1的用户域构造fake_chunk,然后修改chunk1的pre_size和size的flag位,使chunk1被认为是已经释放的fake_chunk,并修改chunk2的fd,bk绕过检查。free(chunk2),此时通过pre_size检查chunk1大小,则fake_chunk被检测到,导致chunk1与fake_chunk合并。chunk1,2分别用于达成unlink,chunk3用于隔离top-chunk。利用edit函数的堆溢出特性一次性对chunk1,2进行修改。
2025-01-22 23:03:59
410
原创 canary保护攻击方法总结
canary来源于SLT中产生的随机数,在函数栈帧创建时,通常会将这个值插入离ebp较近的地方,函数返回时将这个位置的数与SLT中的值进行比较,如果不同则跳转至_stack_chk_fail函数并退出进程.我们可以通过以下几个方面对canary进行漏洞利用.32位下canary是四字节数,64位下则是八字节.
2025-01-08 20:50:03
435
原创 [FSCTF 2023]What am I thinking?
题目链接:https://www.nssctf.cn/problem/4472题目没给附件,直接链接靶机大概可以看出是base64加密,所以可以用base64解密,可以得到一个二进制文件。
2025-01-07 12:27:09
220
原创 [HGAME 2023 week2]YukkuriSay
可以看到print_str函数相当长,我们可以远程连接一下,可以得到以下结果结合print_str中22行的信息可以得到此函数会将输入的内容在油库里的对话框中输出,且50个字符会换行,且因为函数中已经进行了格式化(%s)我们无法对栈上内容做出修改,但泄露还是可以的,且与油库里的对话在输入n/N前是无限循环的,结合vuln函数最后有个非栈上的格式化字符串,我们可以通过泄露libc和栈地址,修改printf的got表为system,将返回地址修改为vuln,再读入/bin/sh\x00达到getshell.
2025-01-04 12:22:08
342
原创 STL容器-容器-vector
建立一个自定义类创建容器并初始化三个元素将元素以尾插法插入容器中it!= v.end();it++)使用迭代器遍历容器。
2024-11-14 09:33:42
305
原创 构造函数与析构函数
构造函数与析构函数在类的创建时会自动调用,其中构造函数用于初始化类的内部条件,析构函数用于销毁(释放空间/保护指针.......)如果不写二函数,编译器会自动填充两个空实现的构造/析构函数析构函数在类的生命周期结束时才会被调用,如在主函数中创建类,析构函数会在主函数返回前调用二函数没有返回类型,没有返回值。
2024-11-14 08:19:08
210
原创 动态*规划
1.如抢则获得的财富为dp[i-3]+nums[i-1],当前房间的财富与前i-2房间的总财富。强盗在一条有很多房间的大街上抢劫,但他不能抢劫相邻的房间,他应该如何规划才能强到更过钱?根据dp[i-3]+nums[i-1]与dp[i-2]的大小选择是否抢第i间房间。// 路径消耗:dp[i][j-1]+map[i][j]//路径消耗 :dp[i-1][j]+map[i][j]2.如不抢则获得前i-1房间的总财富dp[i-2]//1.向右走来的 [i][j-1]//2.向下走来的 [i-1][j]
2024-11-13 21:39:33
219
原创 -哈夫曼树
1.将最小权重的两个叶子节点作一个新节点N1,N1的权重为这两个叶子节点的权重之和(权重小放在左孩子,权重大放在右孩子)2.再挑选两个权重最小的节点,重复1的操作。最后得到了WPL最小的树,称为哈夫曼树。可以使被频繁使用的字符用较短的字符编码。将使用频率作为权重造出的二叉树。
2024-11-13 16:25:51
176
原创 ret2shellcode
程序本身会输出buf的地址,此时我们可以用pwntools中的recvuntil接受此地址(字符串),并将其转化为16进制数字,使用变量buf代表此为buf的地址。最后用buf的地址覆盖返回地址,使得read函数执行后跳转到buf的地址,开始执行buf中的内容,即我们构造的shellcode以劫持程序。此函数的buf地址是随机的,且我们能向buf中写入,则我们要想办法二次返回buf中执行我们写出的shellcode。
2024-11-13 15:17:54
288
原创 cpp中的引用与类
在主函数内直接引用时,会因访问权限报错,因为这里的x,y,speed都是私有(private)的,导致无法在类的外部经行修改。与c语言中的结构体十分形似,但略有不同,你可以直接对其经行命名不需要繁琐的typedef操作。引用并不会创造一个新的变量,只是给原来的变量取了一个新的名字,让它可以以此形式被改变,操作。二者的功能基本相同,唯一不同的是类中的数据默认是私有的,而结构体中则是公开的。类中可以声明函数,此时函数被包含在类中,也需要.引用。引用可以和指针一样,直接改变内存地址内的数值。
2024-11-10 10:55:15
619
原创 树与二叉树
2.对于度为m的节点,第i层上最多有pow(m,i-1)个节点----->(到i为止每层都有m个节点)对于非空二叉树T,如果叶子节点个数为n0,度为2的节点数为n2,n0=n2+1。线索二叉树不再通过递归实现遍历,而可以类似链表一般用前驱后继指针遍历。三种遍历的实质就是递归与打印的顺序不同,每种遍历都有自己的独特作用。实线为原二叉树,加上虚线后改造为线索二叉树。2.如果上一层没有铺满,不能有下一层。1.树的节点数=所有节点的度数+1。在相同层数的树中拥有最多的节点数。遍历通过亲子与线索遍历。
2024-11-05 20:11:00
320
原创 双向链表_栈_队列
但链表中寻找后继节点的时间复杂度为O(1),但寻找前驱节点的时间复杂度为O(n),为克服这种缺点,可利用双向链表,双向链表有两个指针域,一个指向前驱节点,一个指向后继节点。
2024-11-02 10:59:52
433
原创 单链表的使用技巧
4.使两指针同时前进,直到两指针相等,返回此时的地址。将快指针前移三个身位,并使快慢指针同时位移。当快指针为NULL时,慢指针来到所求位置。2.长度相减,得到的数值为快慢指针的距离。3.快指针指向较长链表,慢指针指向小链表。读取位于链表倒数第三个节点的数据。先写这么多........如何找到第一个公用节点。1.计算出两链表的长度。
2024-10-31 21:20:44
386
原创 字符串相关函数
此时无法将arr中元素化为1,因为以字节为精度初始化,导致四个字节的int初始化为01 01 01 01。在arr1中找到与arr2相同的部分,返回子串在原串中的首字符地址,如果找不到返回NULL。1.第一个参数不为null时,函数将寻找str中的第一个标记,并保存标记在字符串中的位置。内存拷贝,不仅可以拷贝字符串,所以返回类型为泛型指针,根据不同用途自行类型转化。strcpy的强化版本,多了一个count参数,可以用来控制拷贝字符串的大小。(此函数会改变字符串,一般被切分的字符串都是被临时拷贝的内容)
2024-10-30 15:31:10
1819
原创 数组,函数指针
因为[]的优先级大于*,所以*与p必须用()结合才能代表一个数组指针int:表示数组中数据的类型[10]:代表数组中元素的个数此时p存放了数组的地址,对p解应用可以得到数组名,即首元素地址。
2024-10-28 19:25:43
216
原创 柔性*数组
3.对包含柔性数组结构体类型变量的创建需要malloc开辟空间,且开辟空间应大于柔性数组的预计大小与结构体大小的和。当想要改变数组大小时,可使用realloc直接对结构体空间 经行更改。结构体中最后一个元素是大小未知的数组,称呼此数组为柔性数组成员。2.当计算此结构体大小时不会计算柔性数组所占空间。1.结构体中必须至少有一个其他成员。且柔性数组只能放在结构体最后。如a[0]代表数组元素未知。
2024-10-27 15:47:46
159
原创 动态内存管理
1.malloc:1.malloc:功能:开辟内存块,返回指向内存块起始的指针,需要使用时需要自己经行类型强制转换,开辟失败时返回NULL.数组开辟空间:开辟动态内存:(需要对开辟失败做处理)当内存释放完后,p成为野指针,此时向p中输入NULL将其保护,二者基本上成对出现free必须释放动态开辟的空间,否则报错此时不会报错也不会有动作,等于没写void*calloc (size_t num,size_t size)==(元素个数,元素大小)
2024-10-26 19:01:11
196
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅