re1
先看运行下程序。发现输入提示,那用IDA打开搜索关键字符串,利用交叉引用定位函数。
函数对用户输入前面几个字符进行判断,符合就是flag,直接提取出判断条件中的数据即可,那就是flag.
flag{Sing_fDfkl_CTF}
angr2_1
ELF文件,先用IDA打开看下,如下:
main函数以及把程序逻辑写的很清楚了,运行时大致流程是:
初始化passwd,读取用户输入,并对用户输入调用complex_function函数,返回数据,并对返回数据与passwd进行check equal判断。
complex_function函数函数如下:
check函数如下:
complex函数对输入加上了某个偏移,我们可以写个破解脚本,可以暴力,可以逆向那个运算操作,但我这选择简单的暴力,代码如下:
#include <string>
#include <iostream>
#include <vector>
using namespace::std;
int main()
{
string passwd{ "IKAWTEQWJHQTVRCF" };
string flag;
for (int i = 0; i < 16; ++i)
{
for (auto j = 'A'; j < 'Z'; ++j)
{
auto t = (j - 65 + 29 * (18 - i)) % 26 + 65;
if (passwd[i] == t)
flag.push_back(j);
}
}
cout << flag << endl;
return 0;
}
flag{GLEDDRGPFGSYDCQW}