下载习题,用ida打开
shift+F12
第一行即为flag
ida打开
shift+F12打开字符串窗口
发现
按x键查看引用
可以找到流程图
F5查看代码
分析这段代码:
首先,程序创建了一个缓冲区(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
打开文件,得
F5查看代码
分析代码:
这段代码是一个简单的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!"并返回。
看到flag相关字符串,并利用代码分析得到的程序得到正确flag
顺利完成!