思路
是个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}