首页
社区
课程
招聘
[原创]KCTF Q3 第八题:人妒英才 WP
2019-9-23 00:17 2356

[原创]KCTF Q3 第八题:人妒英才 WP

2019-9-23 00:17
2356
用IDA载入CM,找到main函数
int __usercall sub_41B870@<eax>(int a1@<xmm0>)
{
 ... //省略掉初始化

  dword_428300 = 11;
  dword_428304 = 4;
  v85 = sub_4115F5(&dword_428300, dword_428000);
  v86 = v1;
  dword_428308 = v85;
  dword_42830C = v1;
  sub_4113B6(byte_4252C2);
  v90 = 0;
  v2 = sub_411802(std::cout, "Ep =  y^2 = x^3 + 125*x  ");
  v3 = std::basic_ostream<char,std::char_traits<char>>::operator<<(v2, sub_411159);
  sub_411361(v4, &v19 == &v19, v3, a1);
  v5 = sub_411802(std::cout, "Prime field p=127,base point G(11,4),publicK(120,41) please find private key k");
  v6 = std::basic_ostream<char,std::char_traits<char>>::operator<<(v5, sub_411159);
  sub_411361(v7, &v19 == &v19, v6, a1);
  v8 = sub_411802(std::cout, "input your flag:");
  v9 = std::basic_ostream<char,std::char_traits<char>>::operator<<(v8, sub_411159);
  sub_411361(v10, &v19 == &v19, v9, a1);
  sub_411212(std::cin, &str1);
  v84 = &v16;
  v22 = sub_411447((int)&v16, a1, (int)&str1);
  v21 = strencrypt((int)&v83, v16);             // 加密输入的字符串
  v20 = v21;
  strmove((int)&str1, a1, v21);
  free(a1, (int)&v83);
  flag = 94;
  ... //初始化变量,太长,省略掉
  v18 = sub_4113D4((int)&v82);
  v11 = sub_4112C1(&v81, (int)&flag, (int)&v79);
  newstr(*v11, v11[1], v18);                    // start,end
  if ( check(&str1, a1, (int)&str2) )           // memcmp,把所有字符串加密后的结果dump一份就行了
    print("try again", v19);
  else
    print("Congratulations~~", v19);
  v12 = system("pause");
  sub_411361(v13, &v19 == &v19, v12, a1);
  v80 = 0;
  free(a1, (int)&str2);
  v90 = -1;
  free(a1, (int)&str1);
  v18 = v14;
  sub_411677((int)&savedregs, (int)&dword_41BC54, v80);
  return sub_411361((unsigned int)&savedregs ^ v89, 1, v17, a1);
}
CM整体逻辑比较简单,加密输入字符串后比较加密后的结果。
用OD载入CM,输入1111111111。

可以看到结果都差不多,用一个DWORD表示一个字符,前两个BYTE 5E26是特征字符,第三个应该是表示字符index,可以不看,最后一个是字符加密的结果。
再往下单步几次就能看到flag加密后的样子了。

我直接收集0-9 a-z加密后的结果。
1        2        3        4        5
5E26005C 5E265637 5E262D12 5E26046C 5E260047

6        7        8        9        0       
5E265622 5E262D7C 5E260457 5E265A32 5E263102

a        b        c        d        e        f        g
5E26005E 5E265639 5E262D14 5E26046E 5E265A49 5E263124 5E26087E

h        i        j        k        l        m        n
5E260059 5E265634 5E262D0F 5E260469 5E265A44 5E26311F 5E260879

o        p        q        r        s        t        u       
5E260054 5E26562F 5E262D0A 5E260464 5E265A3F 5E26311A 5E260874

v        w        x        y        z
5E265E4F 5E26352A 5E260C05 5E26625F 5E26393A
对比加密结果的最后一位,把flag还原。
?        a        n        x       
5E260013 5E26565E 5E262D79 5E260405
u        e        ?        2       
5E265A74 5E263149 5E260829 5E265E37
0        1        9        ?    
5E263502 5E260C5C 5E266232 5E263929
?        3       
5E261033 5E266612
虽然没有全部还原,但是已经能猜到flag了,实在猜不到可以继续抓A-Z和特殊符号的加密结果,也能还原出来。
flag:Kanxue_2019_Q3

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回