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)
相关推荐
qingyun9892 小时前
深度优先遍历:JavaScript递归查找树形数据结构中的节点标签
前端·javascript·数据结构
2401_837088502 小时前
简要总结 HashSet 和 HashMap(Java)
java·开发语言
熬夜敲代码的小N2 小时前
Vue (Official)重磅更新!Vue Language Tools 3.2功能一览!
前端·javascript·vue.js
小彭努力中2 小时前
1.在 Vue 3 中使用 Cesium 快速展示三维地球
前端·javascript·vue.js·#地图开发·#cesium·#vue3
毕设源码-钟学长2 小时前
【开题答辩全过程】以 基于Java的家政服务管理系统的设计与实现为例,包含答辩的问题和答案
java·开发语言
一棵开花的树,枝芽无限靠近你2 小时前
【face-api.js】1️⃣基于Tensorflow.js的人脸识别项目开源项目
javascript·开源·tensorflow·face-api.js
小白学大数据2 小时前
Java 爬虫对百科词条分类信息的抓取与处理
java·开发语言·爬虫
一字白首2 小时前
Vue3 进阶,新特性 defineOptions/defineModel+Pinia 状态管理全解析
前端·javascript·vue.js
Gold_Dino2 小时前
agc011_e 题解
算法