最近开始学恶意代码,于是决定刷一下ctf - Re 方向的题。
题目链接:攻防世界 (xctf.org.cn)
game
启动这个exe可以看到是个游戏,需要通过输入数字,来将上面所有的“灯”点亮
输入1之后效果如图
下面开始逆向分析。
静态IDA
IDA打开,函数窗口ctrl + f搜索main函数
双击跳转,f5查看伪代码
双击main_0 进一步跟进
显然sub_45A7BE是printf
选中这个函数,快捷键n,重命名
重命名为printf
然后看主函数,可以看到是一个while(1)里面嵌套了一个do...while
首先用户输入一个数n,并赋值给v5(从而可以判断出sub_4596D4()函数应该是scanf()函数)
如果不是n > 8: 重新输入
如果n <= 8:break 进入下一个代码段的判断。
如果n != 0:执行sub_4576D6(v5 - 1),这个应该就是对“灯”的状态产生影响的函数。
如果n == 0: 将byte_532E28[]这个数组归零,从而可以猜测这个数组是表示灯的状态。
分析do...while中的while,可以看到需要byte_532E28[]数组里的所有值都是1,否则一直循环下去。
所以可以得到最后的sub_457AB4是与flag有关。
重命名为get_flag并进一步跟进
再进一步跟进
可以看到先是初始化一个长度为56的v5[]数组
然后通过qmemcpy()函数【类似于c语言里的memcpy()函数,用于实现内存拷贝操作,通俗来说就是进行赋值】
qmemcpy(v2,"{ ",2)表示将"{"和" "赋值给v2数组的前两个
然后从v2[2]开始初始化v2数组。
同时还初始化了v3和v4数组。
v2 v3 v4数组加起来长度正好是56。
然后将v2里的元素与v5做异或,并与0x13u做异或,
最后输出字符串。
Python代码:
答案:
zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}
动态OD
插件 -中文搜索 -ASCII
找到flag的位置,双击跳转
可以看到生成flag的这个函数的地址是0045E96D
然后在找到输入函数 也就是push n之后,调用的函数
直接将地址改为上面生成flag的函数的地址
然后f9运行程序,直接得到答案
open-source
直接给了个.c文件,也就是直接给了源码,所以直接分析源码即可
分析源代码,可以看到主要是要求3个参数
first = 0xcafe
second 要满足:second % 5 != 3 and second % 17 == 8:由第二个条件容易猜到是25
argv[3] = h4cky0u
【注意:如果两个字符串相等,strcmp返回的结果是0!所以如果不相等的话,才返回1】
答案:c0ffee
simple-unpack
PEID没识别出来,exeinfo和DIE识别出来是upx加壳
拖到upx tool里解压缩
然后用IDA打开,直接看到了flag,就是在主函数里面
答案:flag{Upx_1s_n0t_a_d3liv3r_c0mp4ny}
insanity
没有加壳,是个ELF文件
用IDA打开,查看main函数
sleep(5u)表示暂停了5秒
v3 = time(0)表示 返回自纪元(1970 年 1 月 1 日 00:00:00 UTC)以来的当前时间(秒数),并存储在变量 v3
中 ,也就是时间戳
然后以v3作为种子生成随机数
v4是一个随机数
v4 % 0xA 表示v4 % 10,用来将v4限制在0~9之间。&strs[]表示对strs这个数组取值
双击strs跟进
看到明文存储的flag。
实际上IDA里查看strings,或者用strings.exe查看字符串也可以实现。
标签:攻防,函数,题集,v2,新手入门,flag,v3,v4,数组 From: https://www.cnblogs.com/Chenlead/p/18474096