NSSCTF动调题包通关

仅供个人学习使用,侵权删除!

[RE2]P1

定位到字符串即可

脱壳类

[RE2]P2

锻炼ESP定律脱壳

官方也给了方法。注意OD的ctrl+a是自动分析

X64dbg也行

[RE2]P3

也是一个脱壳题。

经检测是32位程序,可以使用OD和X32,我这里就用X32了

先F9找到字符串,再追踪哪里引用到这里了

最终定位到关键跳:这里就是OEP

ESP定律在这里失效了。单步执行太几把慢了

用工具也可以脱出来

[RE2]P4

这个是P3的延展。

和上一题思路一模一样。我感觉这道题本意是魔改UPX,结果上传错误附件

[RE2]P5

ESP定律秒杀了!

SMC

[RE2]P6

这种题目用IDA动调解决起来最快,我们双击解密函数,进入text段,按U解除定义,按C转为代码,按P定义为函数即可

接下来就是关键代码:

解题脚本:

python 复制代码
cipher = [0x9f, 0x91, 0xa7, 0xa5, 0x94, 0xa6, 0x8d, 0xb5, 0xa7, 0x9c, 0xa6, 0xa1, 0xbf, 0x91, 0xa4, 0x53, 0xa6, 0x53, 0xa5, 0xa3, 0x94, 0x9b, 0x91, 0x9e, 0x8f, 0x0]
flag=''
for i in cipher:
    flag+=chr((i^0x39)-57)
print(flag)

[RE2]P7

这个用一大段函数来介绍SMC,特别提到现在存在内存保护机制,搞不好SMC会导致程序崩溃,这个学到新知识了。

我们还是选择动调,但是需要注意这是linux,用到远程调试(好麻烦)

这里存在这个指令,GetNextNumber函数直接跳到一个地址,我们猜测这个函数是来结合i做索引的

IDA识别错误,我们按Y按Ctrl+E,将返回值改为int即可

结果如下:

cpp 复制代码
int GetNextNumber()
{
  _DWORD v2[66]; // [rsp+10h] [rbp-110h]
  unsigned __int64 v3; // [rsp+118h] [rbp-8h]

  v3 = __readfsqword(0x28u);
  v2[0] = 78;
  v2[1] = 82;
  v2[2] = 81;
  v2[3] = 64;
  v2[4] = 80;
  v2[5] = 65;
  v2[6] = 117;
  v2[7] = 97;
  v2[8] = 43;
  v2[9] = 44;
  v2[10] = 79;
  v2[11] = 37;
  v2[12] = 106;
  v2[13] = 92;
  v2[14] = 52;
  v2[15] = 93;
  v2[16] = 49;
  v2[17] = 101;
  v2[18] = 58;
  v2[19] = 34;
  v2[20] = 75;
  v2[21] = 28;
  v2[22] = 88;
  v2[23] = 93;
  v2[24] = 27;
  v2[25] = 89;
  v2[26] = 75;
  v2[27] = 26;
  v2[28] = 88;
  v2[29] = 76;
  v2[30] = 80;
  v2[31] = 72;
  v2[32] = 63;
  v2[33] = 82;
  v2[34] = 17;
  v2[35] = 14;
  v2[36] = 66;
  v2[37] = 58;
  v2[38] = 71;
  v2[39] = 9;
  v2[40] = 60;
  v2[41] = 8;
  v2[42] = 60;
  v2[43] = 78;
  v2[44] = 51;
  v2[45] = 54;
  v2[46] = 2;
  v2[47] = 53;
  v2[48] = 3;
  v2[49] = 46;
  v2[50] = -1;
  v2[51] = 5;
  v2[52] = 35;
  v2[53] = 30;
  v2[54] = 18;
  v2[55] = 13;
  v2[56] = 30;
  v2[57] = -6;
  v2[58] = 59;
  v2[59] = -4;
  v2[60] = 51;
  v2[61] = 6;
  v2[62] = 22;
  v2[63] = 62;
  return v2[count++];
}

解题脚本:

cpp 复制代码
#include <stdio.h>
int main()
{

	int v2[66]; // [rsp+10h] [rbp-110h]
	v2[0] = 78;
	v2[1] = 82;
	v2[2] = 81;
	v2[3] = 64;
	v2[4] = 80;
	v2[5] = 65;
	v2[6] = 117;
	v2[7] = 97;
	v2[8] = 43;
	v2[9] = 44;
	v2[10] = 79;
	v2[11] = 37;
	v2[12] = 106;
	v2[13] = 92;
	v2[14] = 52;
	v2[15] = 93;
	v2[16] = 49;
	v2[17] = 101;
	v2[18] = 58;
	v2[19] = 34;
	v2[20] = 75;
	v2[21] = 28;
	v2[22] = 88;
	v2[23] = 93;
	v2[24] = 27;
	v2[25] = 89;
	v2[26] = 75;
	v2[27] = 26;
	v2[28] = 88;
	v2[29] = 76;
	v2[30] = 80;
	v2[31] = 72;
	v2[32] = 63;
	v2[33] = 82;
	v2[34] = 17;
	v2[35] = 14;
	v2[36] = 66;
	v2[37] = 58;
	v2[38] = 71;
	v2[39] = 9;
	v2[40] = 60;
	v2[41] = 8;
	v2[42] = 60;
	v2[43] = 78;
	v2[44] = 51;
	v2[45] = 54;
	v2[46] = 2;
	v2[47] = 53;
	v2[48] = 3;
	v2[49] = 46;
	v2[50] = -1;
	v2[51] = 5;
	v2[52] = 35;
	v2[53] = 30;
	v2[54] = 18;
	v2[55] = 13;
	v2[56] = 30;
	v2[57] = -6;
	v2[58] = 59;
	v2[59] = -4;
	v2[60] = 51;
	v2[61] = 6;
	v2[62] = 22;
	v2[63] = 62;
	for (int i = 0; i <= 63; i++)
	{
		v2[i] += i;
		printf("%c", v2[i]);
	}
	return 0;
}

反调试(有待学习)

[RE2]P12

花指令

[RE2]P8

很简单,就一处,改了即可,不多赘述了。

[RE2]P9

同上,只需要掌握基础花指令就能做出来。

[RE2]P10

本质上还是套娃花指令,也不多说了

[RE2]P11

都是一个套路,U-->C-->P,三板斧。

[RE2]P17

几处花指令不多说,一样的去除方式

最终脚本

python 复制代码
flag=''
a="?'+*\"17!\x1B-7\x1B7+\x1B!%7=9"
for i in a:
    flag+=chr(ord(i)^0x44)
print(flag)
相关推荐
草履虫建模15 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
naruto_lnq17 小时前
分布式系统安全通信
开发语言·c++·算法
Mr Xu_18 小时前
告别冗长 switch-case:Vue 项目中基于映射表的优雅路由数据匹配方案
前端·javascript·vue.js
Jasmine_llq18 小时前
《P3157 [CQOI2011] 动态逆序对》
算法·cdq 分治·动态问题静态化+双向偏序统计·树状数组(高效统计元素大小关系·排序算法(预处理偏序和时间戳)·前缀和(合并单个贡献为总逆序对·动态问题静态化
前端摸鱼匠18 小时前
Vue 3 的toRefs保持响应性:讲解toRefs在解构响应式对象时的作用
前端·javascript·vue.js·前端框架·ecmascript
学嵌入式的小杨同学18 小时前
【Linux 封神之路】信号编程全解析:从信号基础到 MP3 播放器实战(含核心 API 与避坑指南)
java·linux·c语言·开发语言·vscode·vim·ux
sleeppingfrog18 小时前
zebra通过zpl语言实现中文打印(二)
javascript
Re.不晚18 小时前
Java入门17——异常
java·开发语言
爱吃rabbit的mq18 小时前
第09章:随机森林:集成学习的威力
算法·随机森林·集成学习
精彩极了吧18 小时前
C语言基本语法-自定义类型:结构体&联合体&枚举
c语言·开发语言·枚举·结构体·内存对齐·位段·联合