-
-
[原创]看雪CTF2018 第四题 流程 by 青蛙mage
-
发表于: 2018-6-24 02:52 3639
-
第一步,信息收集
主流程:
sharp1:
没什么异常
可能使用了MIRACL大数库,以及很多字符串都描述了相近的信息可能性很大
本题带有混淆,IDA有点不灵光了
主流程:
<br> unsigned int flag = 0; int main() { //不影响解题的解密() -> serial //不影响解题的解密() -> 看雪-京东 CTF 2018 printf("*****看雪-京东 CTF 2018*****"); printf("serial:"); //堆检查() //不影响解题的解密() -> success //不影响解题的解密() -> error char ch[0x18]=0; char head[3]=0; scanf("%s",&ch); if(strlen(ch)>23) { //最大23位 printf("error"); return 0; } cinstr(a,&ch[3]); sharp1(); //flag+1 关键点 memcpy(head,ch,3); for(int i=0;i<3;i++) { if(!isdigit(head[i])) { printf("error"); return 0; } } sharp2(); //flag +1 关键点 if(flag==2) { printf("success"); } else{ printf("error"); } system("pause"); }
sharp1:
void sharp1() { mirsys *mip(500, 16); //初始化 big a, b, c, d; //a=d**c mod b temp1 = 0x208CBB7CD6ECC64516D07D978F5F0681F534EAD235D5C49ADD72D2DB840D5304; //不要吐槽,省力 temp2 = 0x7da39de66016477b1afc3dc8e309dc429b5de855f0d616d225b570b68b88a585; temp3 = 0x3e9; temp4; cinstr(a, ch[3]); cinstr(b, temp2); cinstr(c, temp3); if (mr_compare(a , b)) { return 0; } powmod(d, b, c, a); //幂模 ctostr(temp4, d); zero(a); //释放 zero(b); zero(c); zero(d); mirexit(); //结束 if (strcmp(temp4, temp1)) { flag += 1; } }<br>
<br> unsigned int flag = 0; int main() { //不影响解题的解密() -> serial //不影响解题的解密() -> 看雪-京东 CTF 2018 printf("*****看雪-京东 CTF 2018*****"); printf("serial:"); //堆检查() //不影响解题的解密() -> success //不影响解题的解密() -> error char ch[0x18]=0; char head[3]=0; scanf("%s",&ch); if(strlen(ch)>23) { //最大23位 printf("error"); return 0; } cinstr(a,&ch[3]); sharp1(); //flag+1 关键点 memcpy(head,ch,3); for(int i=0;i<3;i++) { if(!isdigit(head[i])) { printf("error"); return 0; } } sharp2(); //flag +1 关键点 if(flag==2) { printf("success"); } else{ printf("error"); } system("pause"); }
void sharp1() { mirsys *mip(500, 16); //初始化 big a, b, c, d; //a=d**c mod b temp1 = 0x208CBB7CD6ECC64516D07D978F5F0681F534EAD235D5C49ADD72D2DB840D5304; //不要吐槽,省力 temp2 = 0x7da39de66016477b1afc3dc8e309dc429b5de855f0d616d225b570b68b88a585; temp3 = 0x3e9; temp4; cinstr(a, ch[3]); cinstr(b, temp2); cinstr(c, temp3); if (mr_compare(a , b)) { return 0; } powmod(d, b, c, a); //幂模 ctostr(temp4, d); zero(a); //释放 zero(b); zero(c); zero(d); mirexit(); //结束 if (strcmp(temp4, temp1)) { flag += 1; } }<br>
void sharp2() { temp1 = 0x912CA2036A9A0656D17B6B552F157F8E; temp2 = "0001314000000000"; //噫,这个1314仿佛是在..... //影响解题的解密() -> pediy //一个提示 temp2[0] = head[0]; temp2[1] = head[1]; temp2[2] = head[2]+1; //这也是一个提示 aesroundkey(temp2) //这里流程和置换表同AES加密中的roundkey环节 10轮 并输出最终密钥 此时有种不详的预感 temp3 = "7065646979000000"; temp4 = temp3 ^ temp2; aesroundkey(魔改)(temp4); if (strcmp(temp4, temp2)) { flag += 1; } }
第三部,解密
void sharp2() { temp1 = 0x912CA2036A9A0656D17B6B552F157F8E; temp2 = "0001314000000000"; //噫,这个1314仿佛是在..... //影响解题的解密() -> pediy //一个提示 temp2[0] = head[0]; temp2[1] = head[1]; temp2[2] = head[2]+1; //这也是一个提示 aesroundkey(temp2) //这里流程和置换表同AES加密中的roundkey环节 10轮 并输出最终密钥 此时有种不详的预感 temp3 = "7065646979000000"; temp4 = temp3 ^ temp2; aesroundkey(魔改)(temp4); if (strcmp(temp4, temp2)) { flag += 1; } }
很明显密码,分为前三位和后X为 3+X !> 23
X部分powmod:
Y=0x208CBB7CD6ECC64516D07D978F5F0681F534EAD235D5C49ADD72D2DB840D5304
P=0x7DA39DE66016477B1AFC3DC8E309DC429B5DE855F0D616D225B570B68B88A585
G=输入
X=3e9
先去复习数学.....
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
他的文章
- 【原创】第六题 WP 5709
- [原创]第三题 write up by 青蛙Mage 6681
- [原创]第十题 write up by 青蛙mage 2191
- [原创]第一题write up 2460
谁下载
无
看原图
赞赏
雪币:
留言: