下载附件,为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
解题完毕!!
收获:成功逆向以文本作为输入的程序。
来源:oschina
链接:https://my.oschina.net/u/4328287/blog/3451037