csaw-ctf-2016-quals:key

下载附件,为exe格式,查壳。

没有加壳,哈哈!

运行下试试。咦?一闪而过?????


拖入OD逐步运行下试试。

运行结束:what happen????

问我?你问我,我也不知道。

既然没有加壳那就在IDA中打开看下:

主函数没有实质性代码,跟进sub_401100。

发现两处关键代码:

1、?W?h?a?t h?a?p?p?e?n?

memset(&Dst, 0, 0xB8u);
sub_401620(&Dst, v5, v6, v7, v8);
LOBYTE(v53) = 3;
if ( v32[*(_DWORD *)(Dst + 4)] & 6 ) { v9 = sub_402A00(std::cerr, "?W?h?a?t h?a?p?p?e?n?", sub_402C50); std::basic_ostream<char,std::char_traits<char>>::operator<<(v9, v10); exit(-1); }

2、"=W=r=o=n=g=K=e=y=" OR "Congrats You got it!"

  if ( sub_4020C0(v12, v45, v13, v48) )
  {
    v28 = sub_402A00(std::cout, "=W=r=o=n=g=K=e=y=", sub_402C50);
  }
  else
  {
    v14 = sub_402A00(std::cout, "|------------------------------|", sub_402C50);
    std::basic_ostream<char,std::char_traits<char>>::operator<<(v14, v15);
    v16 = sub_402A00(std::cout, "|==============================|", sub_402C50);
    std::basic_ostream<char,std::char_traits<char>>::operator<<(v16, v17);
    v18 = sub_402A00(std::cout, "|==============================|", sub_402C50);
    std::basic_ostream<char,std::char_traits<char>>::operator<<(v18, v19);
    v20 = sub_402A00(std::cout, "|==============================|", sub_402C50);
    std::basic_ostream<char,std::char_traits<char>>::operator<<(v20, v21);
    v22 = sub_402A00(std::cout, "\\  /\\  /\\  /\\  /\\==============|", sub_402C50);
    std::basic_ostream<char,std::char_traits<char>>::operator<<(v22, v23);
    v24 = sub_402A00(std::cout, " \\/  \\/  \\/  \\/  \\=============|", sub_402C50);
    std::basic_ostream<char,std::char_traits<char>>::operator<<(v24, v25);
    v26 = sub_402A00(std::cout, "                 |-------------|", sub_402C50);
    std::basic_ostream<char,std::char_traits<char>>::operator<<(v26, v27);
    std::basic_ostream<char,std::char_traits<char>>::operator<<(std::cout, sub_402C50);
    v28 = sub_402A00(std::cout, "Congrats You got it!", sub_402C50);
  }

观察?W?h?a?t h?a?p?p?e?n?处代码,一路跟进sub_401620函数。

发现下面有趣的语句:

v5 = std::_Fiopen("C:\\Users\\CSAW2016\\haha\\flag_dir\\flag.txt", 1, 64);

跟进路线如下:

判断程序的输入可能和该文件有关,试着在该目录下创建文件。文件内容为:what happen?????

创建文件后再次运行程序。

提示错误,判定程序的输入确实由该文件确定,处理了莫名其面的what happen接下来找出正确的Key即可。

从IDA中看,程序的函数各种多,函数调用各种复杂,用OD调试来的快捷。

修改IDA中的基地址与OD保持一致,为动态调试提供参考。

在OD中下断点跟进到,第二个if语句处。

步入跟进:

发现此处的CMP语句将TXT文件中的内容与该字符串进行比较。

在数据窗口中跟随:

将TXT文件中的内容进行修改为:idg_cni~bjbfi|gsxb

再次运行程序。

成功~~~

flag:idg_cni~bjbfi|gsxb

解题完毕!!

收获:成功逆向以文本作为输入的程序。

猜你喜欢

转载自www.cnblogs.com/MuZiShiYe/p/11245001.html