-
-
[原创]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编辑
,原因:
赞赏
他的文章
看原图