Buuctf-reserve-easyre/reserve1/reserve2

一、easyre

下载习题,用ida打开

Buuctf-reserve-easyre/reserve1/reserve2_第1张图片

shift+F12

Buuctf-reserve-easyre/reserve1/reserve2_第2张图片

第一行即为flag

二、reserve1

ida打开Buuctf-reserve-easyre/reserve1/reserve2_第3张图片

shift+F12打开字符串窗口

发现

Buuctf-reserve-easyre/reserve1/reserve2_第4张图片

Buuctf-reserve-easyre/reserve1/reserve2_第5张图片

按x键查看引用

Buuctf-reserve-easyre/reserve1/reserve2_第6张图片

可以找到流程图

Buuctf-reserve-easyre/reserve1/reserve2_第7张图片

F5查看代码

Buuctf-reserve-easyre/reserve1/reserve2_第8张图片

分析这段代码:

首先,程序创建了一个缓冲区(Str1)来存储用户的输入。
然后,它通过一个子函数 sub_14001128F 将提示信息 "input the flag:" 输出到屏幕。
接着,程序等待用户输入,并将输入存储在 Str1 中。
之后,程序检查用户输入的长度是否超过 Str2(一个预先定义的字符串)的长度。
如果用户输入的长度超过了 Str2 的长度,那么程序会退出循环。
在循环内部,如果 Str2 的当前字符是 'o',那么程序会将其替换为 '0'。
然后,程序会检查 Str1 是否与 Str2 匹配。这是通过比较 Str1 和 Str2 的前 v5 个字符来实现的,其中 v5 是 Str2 的长度。
如果 Str1 与 Str2 匹配,那么程序会输出 "this is the right flag!"。否则,它会输出 "wrong flag"。
最后,程序返回0并结束。
因此,这个程序看起来是用来验证用户输入的密码("flag")是否正确的。密码是预定义的字符串 Str2,其中的 'o' 字符被替换为 '0'。如果用户输入的字符串与 Str2 匹配(在长度限制内),那么程序会认为密码是正确的。

因此,将str2中的o改为0,得到flag

Buuctf-reserve-easyre/reserve1/reserve2_第9张图片

三、reserve2

打开文件,得

Buuctf-reserve-easyre/reserve1/reserve2_第10张图片

F5查看代码

Buuctf-reserve-easyre/reserve1/reserve2_第11张图片

分析代码:

这段代码是一个简单的C程序,用于验证用户输入的"flag"是否正确。以下是这段代码的详细解释:

使用fork()函数创建一个子进程。
如果pid非零,表示这是父进程,父进程会等待子进程结束,并获取其退出状态。
如果pid为零,表示这是子进程。子进程会修改flag字符串中的某些字符,然后结束。
修改flag:

在子进程中,它遍历flag字符串。
如果字符是'i'或'r',则将其替换为'1'。
用户输入:

提示用户输入"flag"。
使用__isoc99_scanf函数读取用户输入到s2缓冲区。
验证flag:

使用strcmp函数比较修改后的flag和用户输入的s2。
如果两者相同,输出"this is the right flag!"并返回。
否则,输出"wrong flag!"并返回。

Buuctf-reserve-easyre/reserve1/reserve2_第12张图片

看到flag相关字符串,并利用代码分析得到的程序得到正确flag

Buuctf-reserve-easyre/reserve1/reserve2_第13张图片

顺利完成!

Buuctf-reserve-easyre/reserve1/reserve2_第14张图片

你可能感兴趣的:(学习)