攻防世界新手入门题集

最近开始学恶意代码,于是决定刷一下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查看字符串也可以实现。

posted @ 2024-10-18 13:54  Chenleader  阅读(1)  评论(0编辑  收藏  举报