六月DASCTFre方面wp

T0p Gear

题目是upx壳,先用upx脱壳后载入ida。
观察程序的逻辑。有三个关键check,分别进入观察逻辑。在这里插入图片描述
check1(其中sub_401080是相等的比较函数)这段flag的结果就是字符串(注意字符串的顺序)
在这里插入图片描述
其实看汇编代码更直接一些。
在这里插入图片描述
check2,这是一个aes加密,对字符串进行加密然后和输入的数据进行比较。
在这里插入图片描述
可以直接在call这一位置下断,观察rax寄存器的情况。gdb调试下断即可。

在这里插入图片描述
查看rax寄存器的内容,得到字符串。
在这里插入图片描述
check3同理
在这里插入图片描述
在这里插入图片描述
拼接起来得到fag c92bb6a5a6c3009124566d882d4bc7ee

easy_maze

一道简单的迷宫题,直接分析算法即可。
在这里插入图片描述
逻辑是输入字符串,四种,分别是jkuh四种,进入函数分别代表
向下移动
在这里插入图片描述
右移
在这里插入图片描述
上移
在这里插入图片描述
左移
在这里插入图片描述
在这里插入图片描述
从23开始走出30。结果jkkjjhjjkjjkkkuukukkuuhhhuukkkk
然后md5
在这里插入图片描述

Magia

前面是个字符为Dep{}的函数和长度是32的限定。后面有三个限定。
在这里插入图片描述

int main()
{
    char v59[16] = {51,0,21,9,11,54,6,12,2,58,44,8,49,11,55,12};
    char v43[16] = {76,101,96,114,100,73,112,99,108,69,83,97,78,100,72,97};
    char v11[32] = {14,5,0,11,13,9,2,3,12,5,15,1,14,4,15,13,1,8,15,15,9,3,15,14,15,4,15,6,2,5,5,13};
    char flag[33] = {0};
    int i = 0,j = 0,k = 0,v5 = 0;
    for(i =31;i > v5;i--)
    {
        for(j = 33;j<127;j++)//j = byte_404004[v5]
        {
            for(k = 33;k < 127;k++)//k = byte_404004[i]
            {
                if((j^k) == v59[v5])
                {
                    if((j&k) == v43[v5])
                    {
                        if((j &0xf)==v11[v5] && (k & 0xf) == v11[i])
                        {
                            flag[i] = k, flag[v5] = j;
                        }
                    }
                }
            }
        }
        v5++;
    }
    puts(flag);
    return 0;
}

得到结果
在这里插入图片描述
感觉这是一个不唯一的flag。根据提示,字符串用_分割。用上面的代码限定出每个字符所有情况,找到最合适的Nep{mircle_and_maho_is_not_free}
其实在这里只要限定好Dep{}和32位和14位的值正确就可以进行下一步的计算。但最后一步还是需要完整的字符串
在这里插入图片描述挺懵,这个时候需要index = 14的值为正确结果。动态调试进入sub_403000,将代码给dump下来。
ollydbg dump当前状态的方法:动态调试到目标位置ollydump插件。
载入查看结果
在这里插入图片描述
根据逻辑

int main()
{
    char key[] = "Nep{mircle_and_maho_is_not_free}";
    char misc[] = "Sis_puella_magica!";
    char x[] = {37,110,49,19,47,40,32,60,53,52,48,109,59,54,7,60,56,127,93,84,40,30,26,47,59,43,85,54,73,109,102,126,0};
    char flag[32];
    for(int i = 0;i<32;i++)
    {
        flag[i] = key[i] ^ x[i] ^ misc[i%18];
        printf("%c",flag[i]);
    }

}

或者od载入
在这里插入图片描述
最后的计算结果存放在[ebp+edx-0x4C]中,在所指位置下断点。找到指定位置
在这里插入图片描述
得到最终flag

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值