首页
社区
课程
招聘
[原创]2019CTF晋级赛Q1第五题青梅竹马
2019-3-25 17:14 4989

[原创]2019CTF晋级赛Q1第五题青梅竹马

2019-3-25 17:14
4989

唉 找来找去我之前得idb文件不见,凭着记忆整理了一份

 

试运行:

 

然后ida分析:

用的dialog写得,然后:
消息循环:

然后消息循环找到COMMAND:

获得flag:

 


然后判断字符得类型:

经过分析那个bianxing 必须返回2,然后就会打印成功得信息,
进入那个函数:

大数运算,一百以内得素数连乘,然后powmod 让它返回2.

 

然后写了一个c得大数运算得程序,之前实验用的miracl没白学:

#include<Windows.h>
#include<stdio.h>
#include"miracl.h"
int main(void)
{
    printf("this is start\n");
    miracl *mip = mirsys(5000, 10);
    int pre[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 ,0};
    mip->IOBASE = 10;
    big tmp = mirvar(0);
    big n = mirvar(1);
    for (int i = 1; pre[i]!=0x4f; ++i)
    {
        printf("* %#x\t", pre[i] - 1);
        convert(pre[i]-1, tmp);
        multiply(n, tmp, n);

    }
    otnum(n, stdout);
    big d = mirvar(0);
    big e = mirvar(0x53);
    invmodp(e,n,d);
    otnum(d, stdout);
    printf("逆为:\n");
    otnum(d, stdout);
    char flag[64] = { 0 };
    big test = mirvar(0);
    big N = mirvar(1);
    for (int i = 1; pre[i]!=0x4f; ++i)
    {
        printf("* %#x\t", pre[i]);
        convert(pre[i], tmp);
        multiply(N, tmp, N);

    }
    otnum(N, stdout);
    powmod(mirvar(2), d, N, test);
    printf("密文为:\n");
    //mip->IOBASE = 16;
    otnum(test, stdout);
    big_to_bytes(1024,test, flag,0);

    puts(flag);

    return 0;

}


然后代入程序里边去替换:



因为程序是将basedecode得东西,然后传入大数操作得那个函数,解出来之后,得再次baseencode下,我懒直接就代进程序了。
记得改长度哈,后面得A是多出来得东西。

 

然后后主流程里边限制了第6个和第12个是V
所以加上去就行了:


[培训]《安卓高级研修班(网课)》月薪三万计划

最后于 2019-3-25 17:18 被notwolf编辑 ,原因:
收藏
点赞3
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回