当前位置: 首页 > java >正文

NSSCTF-[NISACTF 2022]string_WP

NSSCTF-[NISACTF 2022]string_WP

一、做题过程

将文件拖入DIE中,64位,无壳,在ida中打开

image-20250829175222454

<shift + f12>查看可打印字符串

先看第一段函数,并没有什么收获

image-20250829175311261

跟进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];
}

代码很长,但是核心代码只有这部分:

image-20250829175429828

双击跟进seed值,发现是0x2766

image-20250829175501746

这是一个伪随机数生成器,所以我们可以直接编写代码复现

#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

最后得到伪随机数列

image-20250829175825607

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

http://www.xdnf.cn/news/19155.html

相关文章:

  • 身份证实名认证API集成—身份核验接口-网络平台安全合规
  • mitmproxy的使用初试
  • windows中Qwen3‑Coder 与 Claude Code 搭配使用
  • 《UE5_C++多人TPS完整教程》学习笔记45 ——《P46 待机与跳跃动画(Idle And Jumps)》
  • 【完整源码+数据集+部署教程】植物病害检测系统源码和数据集:改进yolo11-EMSCP
  • Lombok vs Java Record:谁才是未来?
  • week5-[二维数组]翻转
  • Node.js 的流(Stream)是什么?有哪些类型?
  • DBeaver 的 PostgreSQL 驱动包默认存储位置
  • 计算机网络知识--对称加密、非对称加密和数字证书详解
  • “上门做饭”平台的核心技术栈与运营壁垒是什么?
  • OpenCV之霍夫变换
  • Linux系统部署:Certbot 实现 Nginx 自动续期部署 Let‘s Encrypt 免费 SSL 证书
  • css三角形
  • 万字解析RAG(检索增强生成)系统的构建与优化,从基础架构逐步深入到高级技术
  • 深度学习入门Day10:深度强化学习原理与实战全解析
  • 虚拟机快照对内存与磁盘空间的影响
  • Git 合并冲突
  • C++ 编译和运行 LibCurl 动态库和静态库
  • 32.String str=aaa与 String str=new String(aaa)一样吗?new String(“aaa”);创建了几个字符串对象
  • Linux按键驱动开发
  • 明远智睿 RK3568 核心板:以硬核性能解锁多领域应用新可能
  • 手写一个Spring框架
  • 【活动回顾】“智驱未来,智领安全” AI+汽车质量与安全论坛
  • Labview邪修01:贪吃蛇
  • 数据结构:归并排序 (Iterative Merge Sort)
  • 非支配排序遗传算法进化多目标优化算法
  • 【混合开发】Android+webview模拟crash崩溃补充说明
  • 【LeetCode每日一题】141. 环形链表 142.环形链表 II
  • Rspack