给了三个文件,先运行一下exe试试吧,就是输入key,乱输会直接关掉,应该是直接结束了。ida打开看一下。
检查了一下v8是不是正确的key,如果是那就执行下面的函数,否则错误结束。
反正输出flag的地方,和输入的v8也没什么关系,我们直接把checkkey这个校验给nop掉。用x64dbg试一下
为了防止运行完了直接结束,下一个断点。这样我们再乱输入key试试
发现都是乱码啊,有可能linux下可以,我们就不试了,直接用ida接着看
看interestring_function就可以了
传入的参数是v7的地址,在ida能看出来,如果传入地址的话可以把v7这里看成一个数组。
进入函数内部看一下操作
我们可以直接写程序。先把flag_data和v7都提取出来,然后再复制粘贴这一段代码,稍加修改,把v4直接换成v7就可以了。
运行一下
最终flag就出来了
代码:
#include <iostream>
char flag_data[28] =
{
'\xDC',
'\x17',
'\xBF',
'[',
'\xD4',
'\n',
'\xD2',
'\x1B',
'}',
'\xDA',
'\xA7',
'\x95',
'\xB5',
'2',
'\x10',
'\xF6',
'\x1C',
'e',
'S',
'S',
'g',
'\xBA',
'\xEA',
'n',
'x',
'\"',
'r',
'\xD3'
};
signed char v7[] = {
84, -56, 126, -29, 100, -57, 22, -102, -51, 17,
101, 50, 45, -29, -45, 67, -110, -87, -99, -46,
-26, 109, 44, -45, -74, -67, -2, 106};
int main()
{
int* result; // eax
unsigned int v2; // [esp+1Ch] [ebp-1Ch] BYREF
int* v3; // [esp+20h] [ebp-18h]
int j; // [esp+28h] [ebp-10h]
int i; // [esp+2Ch] [ebp-Ch]
for (i = 0; i <= 6; ++i)
{
v2 = *(unsigned long*)(4 * i + v7) ^ 0xDEADBEEF;
result = (int*)&v2;
v3 = (int*)&v2;
for (j = 3; j >= 0; --j)
result = (int*)putchar((char)(*((char*)v3 + j) ^ flag_data[4 * i + j]));
}
std::cout << v7 << std::endl;
}