思路
是个64位程序,直接拿ida打开
发现程序将用户输入和字符串zer0pts{********CENSORED********}比较
尝试提交flag 发现是错误的
继续分析
查看init函数
程序分别调用了funcs_889开始的几个函数
跟进去查看
跟进sub_6E 发现没东西
在这个函数附近看到了sub_795
跟进去查看
这个函数将qword_201090函数替换成strcmp
off_201028替换成了sub_6EA
跟进off_201028查看
正是 strcmp在plt表中的位置
查看sub_6EA函数的逻辑

查看qword_201060值
只要按照上面的代码加回qword_201060中的值就能还原flag
exp
#include<stdio.h>
#include<stdint.h>
#include<string.h>
int main()
{
char enc[] = "zer0pts{********CENSORED********}";
uint64_t key[] = {0, 0x410A4335494A0942, 0x0B0EF2F50BE619F0, 0x4F0A3A064A35282B, 0};
int len = strlen(enc);
len = (len>>3) +1;
for(int i =0; i < len; i++)
{
*(uint64_t *)&(enc[8 * i]) += key[i];
}
printf("%s", enc);
return 0;
}因为是qword数据类型,所有要使用uint64_t或者__int64
这里不直接写enc[8 * i]是因为要将char型转换成_int64, 用指针的形式写
flag
zer0pts{l3ts_m4k3_4_DETOUR_t0d4y}






