迷宫问题中的dfs(进阶)
前言我们在基础模板那篇文章中已经讨论了一个一般性的走迷宫使用的dfs模板,在这里我们依照WolvCTF的ej题目来讲解一下有较多限制的迷宫题目如何做。
ej 题目非迷宫部分的简单介绍因为在这里我们只讨论迷宫部分的dfs,如果读者想做这道题可以找本人要。(笑)
这里是main函数的部分,可以看到题目的逻辑是这样的,首先输入一个字符串,这个字符串其实就是走迷宫所用的操作,然后经过一个判断,如果判断成功就输出”correct!“,然后用输入作为密钥解密密文,得到flag明文并输出,因此我们其实只需要保证第一个判断能够成功就可以了。
但是这里有一个问题就是,这个判断是走迷宫,但是这个走迷宫的方法不是唯一的,也就是说,我们需要找到所有的路径,然后挨着判断输出是否是真正的flag。
这个判断函数里面是一个走迷宫,这里将迷宫图案贴出来。
0 0 0 0 0 00 0 1 1 0 00 0 1 0 0 00 0 1 0 0 10 0 0 1 2 02 0 0 0 0 2
这里有三种情况,分别是0 ,1,2。
要求是这样的,0是可以走的,并且没有限制,起点是(0,0),终点也是(0,0)。
1是可以 ...
angr初体验
本人的 angr 学习来源于某位大佬的博客
目前本人的angr使用仍不熟练,或许存在部分问题,恳请读者指出
https://agate-colony-3f5.notion.site/angr_ctf-8a26aa74a4a74c428ef6129e2df6dd02(大佬的文章)
angr 使用详细步骤0.引入angr 和claripy1.创建项目projectproject=angr.Project(path,auto_load_libs=False)
其中path为要运行的文件的路径比如这样
path="C:\\Users\\DELL\\Desktop\\angr_ctf-master\\solutions\\11_angr_sim_scanf\\11_angr_sim_scanf"
auto_load_libs=False的意思是不自动自动载入依赖的库
如果是位置无关文件,还要加上载入的基地址,比如这样
base = 0x66666666 # 动态链接库被装载的时候需要一个基址proj = angr.Project(path, m ...
迷宫问题中的dfs(基础模板)
前言最近本人在做 WolvCTF 的时候遇到了一个特别有意思的迷宫题,在写dfs的时候遇到了一些问题(www,本人高中还是信竞生,连个dfs都写不出来,这是太没用了……)最后由本人在之前写过的一道简单的迷宫题题解中得到了启发,在此阐释一下我对迷宫中dfs的模板理解。
当然,本人的理解基于自己在高中时学过的知识,可能带有个人风格,读者可以按照自己的习惯来
一道简单的迷宫题,但已经基本有了迷宫题的dfs所具有的特征我们先看那一道比较简单的dfs是如何写的
题目是NSSCTF平台上的sadmaze题目,在本人的个人做题记录中有
这个迷宫的地图是这样的:
11111111111111111111111111111111S0010001000001000000000000000111101110101011111011111011111011010001000100000100000100000101101110101110111011111011101111110001010001010100000101010000011011101110111011101110101110101100000 ...
z3库的学习
z3库的安装pip install z3_solver
注意要安装z3_solver库而不是z3
z3的作用用于约束求解。
如果你已经知道了变量需要满足的若干条件,但是不想写for循环的暴力,那么就可以用这个库,你只需要告诉他变量需要满足的条件,它就可以告诉你满足条件的若干变量。
z3的基本使用模板from z3 import *a=Int('a') #定义单个int型变量b,c,d=Ints('b c d') #定义多个int型变量s=Solver() #定义一个约束器s.add(a+b==10,b-c==7)#添加约束条件,可以添加多个,也可以添加一个s.add(a+c!=5)#s.add可以多次使用print(s.check())#check就是求解,有解的话返回sat,无解返回unsatprint(s.model())#输出解,注意输出的时候不按照定义的顺序来,可以认为输出是无序的'''sat[c = 0, a = 3, b = 7]'''
这些模板中一些特殊的地方定义变量 ...
常见加密算法学习
AES
特征:分组密码、对称加密,算法复杂、密钥长度有多种可能,最常见的是128bits,也就是16个字节。
b站视频学习AES加密过程:
https://www.bilibili.com/video/BV1i341187fK/?spm_id_from=333.337.search-card.all.click&vd_source=a85daf8eb54f32264d9f6976d087fe98
AES加解密代码实现学习:
https://ppppz.net/2022/01/31/AES-P-Z/
(PZ大佬的博客链接)
本人最开始是想自己写的,后来实在不想debug了,于是就抄下了大佬的代码。
RC4
流密码、对称加密、加解密使用同一种算法(最后使用了xor)
有一个s[] 作为黑盒,利用密钥对黑盒进行变换,使得黑盒中变得复杂(初始化)
最终使用黑盒中的数据对明文进行流加密,理论上来说明文密文是等长的
但是由于字符变量取值是0-127,但是密文的取值却是0-255,因此存在显示字符问题
在最终显示密文时可能存在几种情况,一种就是直接显示,可能会出现乱码,一种是用16进 ...
ELF文件的部分知识
GOT 和 PLT 表的相关知识及其在RE中的考察方式什么是GOT表和PLT表ELF文件中包括很多的节,比如.data 节、.text节等,GOT表和PLT表也是这其中的节,PLT表即是.plt节,GOT表即是.got节(这里需要注意的一点是,ELF将GOT拆分成两个表“.got”和”.got.plt”,前者用来保存全局变量引用的地址,后者用来保存函数引用的地址)。
got(全局偏移表)got表是Linux平台用来解决对全局数据,外部函数引用的表,当在程序中引用外部的数据,函数时,通过got表来实现对相关数据符号的解析。
plt(过程链接表)在动态链接过程中, 函数在加载共享库之后,会对got节中的函数地址进行填充,所以,调用的时候利用plt跳转到got表中项指定的地址即可。
(这两段内容摘自网络)
简而言之,ELF文件在编译时无法获取到动态链接库的函数地址,因此在运行时就需要这两个节来获取地址,这两个节的功能类似于exe文件格式中的输入表。
两个表的工作原理当调用到动态链接库的函数时(比如printf、scanf),程序会首先跳转到plt表中的相应位置,接下来有两个分支:
当这个函 ...
linux下双进程保护问题及应对方案
什么是双进程保护问题本题目来自于NSSCTF平台的题目。
ID: 1442 [NSSRound#6 Team]void(V2)
首先,我们应该了解一下Linux下C++的多进程编写。
fork函数本部分以一个实例来讲解一下fork函数产生的双进程。
__int64 sub_CDA(){ __int64 result; // rax int i; // [rsp+Ch] [rbp-14h] __pid_t v2; // [rsp+10h] [rbp-10h] v2 = fork(); // 产生双进程 if ( v2 < 0 ) // 产生双进程失败 exit(1); if ( v2 ) // fork函数的返回值决定了这个进程是父进程还是子进程 { // ...
IDA个人使用报告
IDA个人使用报告前言工欲善其事,必先利其器。IDA的强大是毋庸置疑的,但是由于本人在最开始学习IDA时没有关注IDA的强大功能,只是将就能用就行,这导致本人放弃拥入IDA的怀抱,转而投向OD等在动态分析方面更强大的工具。
然而,OD固然好用,但在大量代码面前必然存在局限性,只有拥抱IDA才能提高自身逆向水平。IDA存在大量的功能快捷键,有些功能能够让使用者在逆向时更加舒服方便。
在之后的文章中,我在给各种功能快捷键分类时是以本人的使用体验分类的,读者可能会有不同感受体验。
基本功能,重要性程度最高,使用与不使用差别非常大
F5:查看伪代码
shift+f12: 可以打开string窗口,一键找出所有的字符串
x:对着某个函数、变量按该快捷键,可以查看它的交叉引用
alt+t :搜索指令,可用来搜索某些关键代码
IDApython:写python脚本,高阶功能,做某些重复操作会更加方便(比如去除花指令)
远程调试
C:表示将当前的数据按照代码形式显示 (去除花指令必备)
D:表示将当前的数据按照数据的形式显示 (去除花指令必备)
P: 定义函数(去除花指令必备)
在函数窗口中用Ctr ...
花指令
花指令什么是花指令花指令就是指在程序中完全冗余,不影响程序功能但对逆向工程产生干扰的指令。
花指令没有固定格式,泛指用于干扰逆向工作的无用指令。
花指令常见类型
相互抵消的操作指令
一个常见的函数头是这样的:
push ebpmov ebp espsub esp,0x100
插入一些相互抵消的操作,使得上段代码成这样:
push ebppushfdadd esp,0xdnopsub esp,0xdpopfdmov ebp espsub esp,0x100
脏字节
有特殊的指令,其字节码是这样的: E8 FF ····其中E8指令为call, E8 FF的意思是跳转到本指令的第二个字节,也就是说,E8 FF的下一条指令为 FF ····,这种情况下E8这个字节码完全没有作用,但是却扰乱了静态分析,将这个字节码称之为脏字节。
也会存在很多其他的脏字节,其中大多是E8(call)这个字节。例如这一段代码:
push ebp jz addr2 jnz addr2 db 0xE8add3: sub esp,0x100 ···add2: mo ...
对exe文件脱壳之后的重建输入表以及函数的转发
对exe文件脱壳之后的重建输入表以及函数的转发作者:tgrddf55
一.问题引入在b站视频(BV1LL4y1n7Af)crackme 第十个视频ceycey中,笔者按照视频所演示的进行脱壳,却发现dump之后的exe文件无法打开,在师傅的指引下,知晓了这可能是本机的windows系统版本太高的问题,并且这个问题可以通过重建输入表来解决,于是笔者开始了重建输入表的学习。
本篇内容包括PE文件中的输入表结构、壳的功能及简单原理、何为dump,如何重建输入表、函数的转发。
如果读者遇到了在64位系统中脱32位程序的upx壳失败的问题,并且上述知识没有任何储备的话,建议从头认真阅读本文章。
本文章是笔者边学边写,因此可能存在部分问题,望读者指正。
二.为什么要重建输入表由于这个问题涉及到较多的前置知识,本篇文章致力于让没有学习这些知识的同学也能理解内容,但笔者能力有限,如果想对该篇内容进行更深刻的理解的话,建议学习PE文件结构
(1)输入表结构exe文件即为PE文件中的一种,这个文件中存有许多结构,类似于一座房子,有窗户,有门……其中输入表就是其中的一种结构。
输入表的作用就是引用外部的 ...














