思路

是个64位程序,直接拿ida打开

image-20240226112347596.png
image-20240226112347596.png

发现程序将用户输入和字符串zer0pts{********CENSORED********}比较

尝试提交flag 发现是错误的

继续分析

查看init函数

image-20240226114941107.png
image-20240226114941107.png

程序分别调用了funcs_889开始的几个函数

跟进去查看

image-20240226115104941.png
image-20240226115104941.png

跟进sub_6E 发现没东西

image-20240226125443454.png
image-20240226125443454.png

在这个函数附近看到了sub_795

跟进去查看

image-20240226125549410.png
image-20240226125549410.png

这个函数将qword_201090函数替换成strcmp

off_201028替换成了sub_6EA

跟进off_201028查看

image-20240226155507023.png
image-20240226155507023.png

正是 strcmp在plt表中的位置

查看sub_6EA函数的逻辑

image-20240226155809056.png
image-20240226155809056.png

查看qword_201060

image-20240226160538423.png
image-20240226160538423.png

只要按照上面的代码加回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}