XCTF社区中有关re的题目超级详细手把手的题解(附带做题实际记录)

声明
PS:如果文中的一些函数看不懂,可以去我写的和本文配套的一个知识点的总结博客中去找功能介绍,还不懂的可以留言,我将与你共同分享经验,共同进步,博客链接:https://blog.csdn.net/zmx2473162621/article/details/103416005

re1

下载附件是个exe文件,由于是入门题,不需要那么多的所谓的peid,所以直接拉入ida中,找到main函数
在这里插入图片描述
然后f5进行反汇编,查看伪代码,
在这里插入图片描述
发现了这个东西,点进去一看
在这里插入图片描述
然后倒序输出就好,得出flag:DUTCTF{We1c0met0DUTCTF}
不过有一说一,,用笔记本打开,发现也有flag
在这里插入图片描述

game:

说实话,这道题我确实有点蒙蒙的…按照顺序输入了1,2,3,4,5,6,7,8然后就莫名其妙的出来了flag:
done!!! the flag is zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}
大致题意是玩一个游戏(一共八个灯,打开第i个灯的时候,改变第N个灯的状态,第(N-1)和(N + 1)的状态也会改变),通关才会出flag,我刚拿到这道题的时候确实有点懵逼的感觉,也不知道改干什么,然后上一题就可以通过记事本得出来,所以我又想了一下,可不可以用记事本直接搜flag,然后查了一下,发现不能,出来的flag一共有两处单词,但后面跟着的都不是真正的flag,那么记事本不行,然后就用peid判断一下是不是有壳,发现是vc编写的…然后???那就把它拉入ida吧,拉入之后,发现函数有点多…真的多!!!!然后就懵逼了,搜了一下发现,是可以直接查找的(我记住了!!!),所以我就在函数窗口直接查找main主函数:
在这里插入图片描述
具体的查找过程是,右键函数名称,然后选中快速筛选,直接在1处直接输入main查找,然后找到_main,打开之后发现,好短…不管了,先f5…:就是上面的3;然后就发现是和main_0有关的,所以双击打开:
在这里插入图片描述
在这里插入图片描述
这个代码看着就有内味了,所以我们来分析一下:
定义的全局变量先记一下…
首先,那一堆的sub就不说了,是提示词(可以进去看一下)
然后对于那些绿色的代码,发现也是游戏的提示部分,那么接着往下面看,,两个while循环,结合题意以及exe来看的话,应该是控制整个游戏的结束的,然后里面的while是为了判断输入的字符是否合法,所以这个可以不用看

if else如果是0的就reset 也是结合着exe和代码共同来看的,所以核心代码就是if下面的sub_4576D6(v1 - 1);还有下面的if(用于判断正确)下的sub_457AB4();,至于中间的那个sub,点进去之后发现好像是输入未完成的时候的提示词…
然后分析第一个if下的函数sub_4576D6(v1 - 1)(我将其命名为:label01):
在这里插入图片描述
接着进:
在这里插入图片描述
返回的都是bool类型???这是什么鬼,返回的既然不是数据,而是bool类型,那么就是和判断有关的,而题中,输入数据的合法性判断了,什么时候输入正确flag也判断了,发现唯独没有输入超出数据范围等的判断,所以这个bool,我就猜是一个数据范围或者说规则更加合理一点;
接着看,if条件那么多,就是数据的判断喽,也就是输入数据的判断,到这里,解题就有两个思路叭

1.直接找到输入的数值,然后正常通关
2.分析通关后发生的事件,然后得出flag
(好像知道可以这样)3.在od下,暴力破解,就是把一些关键的位置,跳转直接nop(空指令),然后最后无条件的跳转到结果那里

  • 第一种思路

首先第一种思路:遵守游戏规则,按输入来:
分析输入的数应该是什么:
在这里插入图片描述
为了读的舒服,把函数变量改一下名字,按键盘上的n,然后改为shuru,(其他函数改法一样),点入label01(处理函数,点入进去):
在这里插入图片描述
然后分析发现,只要输入的数字不一样,就可以直接过也就是把所有数字输入完,相同的数字输入奇数个(你品,你细细的品)
所以到这里就是第一种思路了

  • 第二种思路

:不管输入的是什么,直接分析出来我们想要的答案:
在这里插入图片描述
也就是,从v2开始的数,对59开始的数进行异或,然后再次异或13h,最后输出:
那么写出一个python:
pyhton代码链接:https://pan.baidu.com/s/1_pxbXvhalydXl9MEb285bQ
提取码:z66s

a=[18,64,98,5,2,4,6,3,6,48,49,65,32,12,48,65,31,78,62,32,49,32,
    1,57,96,3,21,9,4,62,3,5,4,1,2,3,44,65,78,32,16,97,54,16,44,
    52,32,64,89,45,32,65,15,34,18,16,0]               #手打确实难顶
b=[123,32,18,98,119,108,65,41,124,80,125,38,124,111,74,49,
    83,108,94,108,84,6,96,83,44,121,104,110,32,95,117,101,99,
    123,127,119,96,48,107,71,92,29,81,107,90,85,64,12,43,76,86,
    13,114,1,117,126,0]
i = 0
flag = ''
while(i<56):
    a[i]^=b[i]
    a[i]^=19
    flag+=chr(a[i])
    i+=1
print(flag)

然后就得出了flag

  • 第三种思路
    我知道有这个思路,但是现在还不会,呜呜呜,过几天我问问大佬,先放放…

Hello,CTF

有关这一题的话,看题目的提示,是一个密文flag,不是明文flag,所以刚开始有点慌,对于这些了解的确实不是太多…不多说,我还是先…运行一些这个程序,发现是只要输入flag正确就可以,那么这种简单的功能,就先用笔记本打开了一下,
在这里插入图片描述
先发现这个,然后用ctrl+f查了一下flag字符串,发现并没有,所以就往下手动查找一下:
在这里插入图片描述
就发现了,success后面是有一串数字的,看着有些像十六进制的数字串,437261636b4d654a757374466f7246756e 先放着
然后peid脱一下壳,之后把他拉进去ida中,找到main主函数,然后直接f5:
在这里插入图片描述
分析一下,把那一串数字放到了以v13为首地址的一个空间中,然后输入是v9,判断v9长度这些就是对于输入的规范,核心代码应该是do…while里面的,然后对于输入的每一个字符,赋值给v4,然后把v4格式化(sprintf … 变成十六进制)到v8中(这里如果看不懂,可以参考我写的有关这题的知识点,里面有sprintf和strcat函数的功能介绍,链接:https://blog.csdn.net/zmx2473162621/article/details/103416005),然后就拼接到v10(可看做flag+=v8)上,然后循环到结束,而判断的过程就是判断输入的字符串,转化为十六进制后是不是v13的那个数字,也正印证了用笔记本打开后看见那串数字的猜想;
知道了这么多,就可以通过py来得到这个字符串;

s="437261636b4d654a757374466f7246756e"
flag=bytes.fromhex(s)
print(flag)

``
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191206093642574.PNG)
所以flag就是   CrackMeJustForFun



关于其他题,我会在后几天陆续补充

发布了29 篇原创文章 · 获赞 13 · 访问量 2755

猜你喜欢

转载自blog.csdn.net/zmx2473162621/article/details/103374532
今日推荐