攻防世界-re新手区wp
https://adworld.xctf.org.cn/
文章目录
re1
下载附件文件
使用exeinfope打开,32位无壳
使用ida打开
发现是明文比较,并没有进行加密,然后看到最上面是赋值语句进入后看到字符串v5即为flag
ida使用小技巧,当光标移动到数据时,可以点击快捷键进行数据类型的转化,
a:将字符进行ascll编码,形成一个字符。
r:将一串数据转化为字符串,但要注意数据大小端的储存方式,这里形成的字符串时逆序的。
*:将数据组合形成数组。
u:消除对某段数据的分析,并呈现为十六进制数据。
c:将选中的数据分析为代码。
p:将选中的代码部分分析为一个函数。
d:转化选中的数据的数据类型,主要有Byte、Word、Dword
此处我们将转化好的数据放置到python中进行处理,直接倒序就可以得到flag
a = '0tem0c1eW{FTCTUD'[::-1]
b = '}FTCTUD'[::-1]
print(a+b)
ganme
使用exefope,32位无壳。
ida中分析,
主函数主要有三部分组成,此处主演展示了后两部分。
第一部分为输出程序出现的界面,然后获取我们输入的n。
第二部分为游戏运行的过程,并重新绘制游戏界面。
第三部分为判定所有行是否已经全部合并,如果是那将进入一个子函数。
所以我们可以明确的看出程序关键的解密并输出flag的函数就是sub_457ab4()
函数解密和输出部分如图示,其实就是一个简单的异或,但值得注意的是这是一种数组的写法:
其中的(&v2 + i)是表示地址偏移,是一种数组的写法,相当于v2[i],这是一种极为常见的写法。
所以我们可以直接根据这个函数写出脚本,注意将v2,v59写为数组就好。
但是这个函数负责将flag输出。
我们可以进行动态调试,并在此过程中控制if判定,最后让程序自己输出flag。
另外可以直接将游戏完成,输出flag。
还可以patch,使用ida将程序判定部分修改,然后输入一个值就可以判定为对,输出flag。
hello,ctf
其中需要补充的函数:
sprintf:函数第一个参数为字符串,第二个是格式,第三个是数据,此函数的定义为:将某串数据以一种特定的格式形成一个字符串。
strcat:函数定义为字符串连接函数,将两个参量都是字符串,将参数二连接到参数一结尾。
所以我们可以简单的看出整个程序的算法就是将输入的flag转化为16进制,然后和与定义好的字符串v13比较,我们可以使用python2中的decode()
方法:
open-source
附件是一份c的源代码,使用编辑器打开分析。
if (argc != 4