nss刷题记录
singout
一道nc连接的题目,主要是禁用了一些获取flag的指令。借鉴了一些wp,有以下方法:
tac${IFS}f* |
感觉挺奇特的
[NISACTF 2022]ezheap

这里申请了两个堆块s与command,存在gets函数会形成堆溢出,system函数会执行command堆块的内容,那么这里的想法就是造成堆溢出从s堆块溢出到command块并写入/bin/sh

这是gets前申请的s堆块与command堆块里面的内容,可以看出我们需要输入28字节大小的内容,再输入command堆块的size,就可以覆盖command堆块里面的内容。

这是gets后的两堆块里面的内容,可以看出确实将command堆块里面的内容覆盖为了/bin/sh字符串,此时再执行system(command)就能获取shell。
from pwn import* |
FSCTF nc
ban了cat、flag、sh、$0,也关闭了输出流,但我们可以通过其他方式获得flag,比如用tac fl*命令并重定向到输入或错误流即可。
[GDOUCTF 2023]真男人下120层
这道题是一道随机数的题目,其实挺简单的,这里我选择的是自己生成相应的随机数
#include<stdio.h> |
from pwn import* |
[NISACTF 2022]UAF
一道堆题目,考的是UAF,比较简单,但是因为刚接触堆,所以还是一步一步的认真写一下解题过程。

该程序实现了创建、编辑、删除与展示的功能。

在del函数中,进行了free了相应的内存块后,并没有将对应的指针设置为NULL,因此这里存在UAF漏洞。

在show函数中,有这么一段代码,在这里一步一步分析
(*((void (__cdecl **)(char *))page + 1))(page); |
void (__cdecl *)(char *)这是将page的指针类型强制转换为指向函数指针的指针
这是一个函数指针的声明,其中__cdecl是一个调用约定,这指向的是一个返回类型为void、参数为char*的函数。
2. ```
(void (__cdecl **)(char *))page(void (__cdecl **)(char *))page+1解引用得到实际的函数指针,并调用该函数传入page作为参数
对转换后的指针+1,移动到下一个函数指针的位置,相当于访问的是函数指针数组的第二个元素
4. ```
(*((void (__cdecl **)(char *))page + 1))(page);
其实简单来说就是调用一个带参数的函数。

存在后门函数,那么可以利用上面那个调用该函数并获取shell。
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
