[NISACTF 2022]string
呜呜呜这道题有坑……
先看题目

查壳
无壳,64位

丢入64ida,找main函数,f5

然鹅什么都没有,再看函数列表有一个flag函数,点进去看伪代码

点击查看代码
puts("The length of flag is 13");
srand(seed);
printf("NSSCTF{");
for ( m = 0; m < 13; ++m )
{
v4 = rand();
printf("%d", (unsigned int)(v4 % 8 + 1));
}
putchar('}');
return &v6[-v12];
这个源码很好写,只不过要注意一个点,需要去找seed种子数
不过好在双击seed,就跳转到种子数那

这里的种子数是十六进制,可以在ida里选中这个值右键,就能转换十进制数了


即seed=10086
由此写脚本
几乎不用做大的改动

点击查看代码
#include<stdio.h>
#include<stdlib.h>
int main()
{
srand(10086);
printf("NSSCTF{");
for (int m = 0; m < 13; ++m )
{
int v4 = rand();
printf("%d",(v4 % 8 + 1));
}
putchar('}');
return 0;
}
到这里有一个坑!!!
你会发现在Windows系统上运行的值提交flag并不正确
后来看别人的wp,才知道要放在Linux上运行的才正确
我用的Ubuntu16运行脚本

点击查看代码
zer0@ubuntu:~$ cat '/home/zer0/桌面/1.c'
#include<stdio.h>
#include<stdlib.h>
int main()
{
srand(10086);
printf("NSSCTF{");
for (int m = 0; m < 13; ++m )
{
int v4 = rand();
printf("%d",(v4 % 8 + 1));
}
putchar('}');
return 0;
}zer0@ubuntu:~$ ^C
zer0@ubuntu:~$ gcc '/home/zer0/桌面/1.c' -o 1.o
zer0@ubuntu:~$ ./1.o
NSSCTF{5353316611126}zer0@ubuntu:~$
flag:NSSCTF{5353316611126}

浙公网安备 33010602011771号