NSSCTF-[NISACTF 2022]string_WP
NSSCTF-[NISACTF 2022]string_WP
一、做题过程
将文件拖入DIE中,64位,无壳,在ida中打开
<shift + f12>查看可打印字符串
先看第一段函数,并没有什么收获
跟进flag函数中查看,伪码如下:
char *__fastcall flag(char *input)
{char *v1; // raxchar *v2; // raxchar *v3; // raxint v4; // eaxchar *i_1; // [rsp+8h] [rbp-38h]int i; // [rsp+1Ch] [rbp-24h]int j; // [rsp+20h] [rbp-20h]int k; // [rsp+20h] [rbp-20h]int n13; // [rsp+24h] [rbp-1Ch]int m; // [rsp+28h] [rbp-18h]int v12; // [rsp+2Ch] [rbp-14h]int i_2; // [rsp+34h] [rbp-Ch]i_1 = input;v12 = (_DWORD)input + 1;if ( (_DWORD)input << 30 ){while ( 1 ){v1 = i_1++;if ( !*v1 )break;if ( !((_DWORD)i_1 << 30) )goto LABEL_4;}}else{
LABEL_4:for ( i = (int)i_1; ((i - 16843009) & ~i & 0x80808080) == 0; i = i_2 ){i_2 = i_1[1];i_1 += 4;}v2 = i_1++;for ( j = *v2; j; j = *v3 )v3 = i_1++;}puts("This a magic!");n13 = (_DWORD)i_1 - v12;for ( k = 0; (int)i_1 - v12 > k; ++k )n13 ^= 0x1Au;if ( n13 != 13 ){puts("error!");exit(0);}puts("The length of flag is 13");srand(seed);printf("NSSCTF{");for ( m = 0; m < 13; ++m ){v4 = rand();printf("%d", v4 % 8 + 1);}putchar(125);return &i_1[-v12];
}
代码很长,但是核心代码只有这部分:
双击跟进seed值,发现是0x2766
这是一个伪随机数生成器,所以我们可以直接编写代码复现
#include <stdio.h>
#include <stdlib.h>
int main()
{int seed=0x2766;srand(seed);for(int i=0;i<13;i++){int v4=rand();printf("%d",(v4%8+1));}return 0;
}
但是注意需要在linux中运行,因为伪随机数列不同
依次使用命令gedit test.c
,进入编辑代码
然后gcc编译,gcc test.c -o test.out
最后运行test.out,./test.out
最后得到伪随机数列
Get_flag:NSSCTF{5353316611126}
二、需要注意的
- 对于伪随机数复现需要在对应系统中运行,比如ELF文件就在linux中运行
- kali linux中运行C语言代码步骤就是:
1.gedit test.c
2.gcc test.c -o test.out
需要注意的
- 对于伪随机数复现需要在对应系统中运行,比如ELF文件就在linux中运行
- kali linux中运行C语言代码步骤就是:
1.gedit test.c
2.gcc test.c -o test.out
3../test.out