Skip to content

小的明?题问

分析

漏洞在下面这个地方

cpp

    memset(currrnt_account, 0, sizeof(user));
}

//account.c 40
int account_delete(user *current_account, user *input_account)
{
    if(memcmp(current_account, input_account, sizeof(user)))
        return -1;

    int idx = find_account(input_account->username);

    memset(&users[idx], 0, sizeof(user));
    memcpy(&users[idx], &users[idx + 1], sizeof(user) * (user_counts - idx - 1));
    account_logout(current_account);

    user_counts--;
    return 0;
// 在这个地方,你可以开两个 nc 端口,同时登录两个账号
// 然后再把他们都 delete 掉
// 这样 user_counts 就会等于 0,find_user 就找不到 root 账号
// 你就可以注册你自己的 root 帐号了
}

int account_rename(user *current_account, user *old_account, user *new_account)
{

另外一个漏洞是在 add 的时候程序会把 \n 替换成 \0

get_flag 用的是 strcmp 进行比较

只要重命名为 root 1,就会被替换成 root\01,并通过 get_flag 的条件,直接获得 FLAG。

本题无需编写 EXP,使用 nc 交互即可完成利用。