解题概要
使用pe分析是32位文件,使用ida反汇编分析代码逻辑,是一道要求用户输入flag,然后比较的题目。
正确flag并不是明文存储,所以解题关键为分析构造flag的函数。
需注意的是使用wchar_t,分析可得是32bit长(搜索得到长度可能是16或32bit)。
以下按时间顺序分享解题过程。
解题过程
主函数非常直白,连续调用四个函数,然后就什么都没干了。
setlocale(6, &locale);
banner();
prompt_authentication();
authenticate();
前三个函数都莫名奇妙,第一个搜索得到是用于区域设置。
第二个获取时间,搞个随机数种子,还输出了欢迎语。
第三个故弄玄虚,函数里只输出了句话叫你输入。
重点在第四个
void authenticate()
{
int ws[8192]; // [esp+1Ch] [ebp-800Ch]
wchar_t *s2; // [esp+801Ch] [ebp-Ch]
s2 = decrypt(&s, &unk_8048A90);
if ( fgetws(ws, 0x2000, stdin) )
{
ws[wcslen(ws) - 1] = 0;
if ( !wcscmp(ws, s2) )
wprintf("S");
else
wprintf("A");
}
free(s2);
}
fgetws是wchar_t版的fgets
wcscmp同样是wchar_t版的strcmp
看到!wcscmp(ws, s2)第一反应便是flag在这里。
ws来自用户输入,那么s2就是flag了。
而s2来自decrypt。看来这就是构造flag的代码了。
decrypt这个函数还算简单,自己转成c或py运行一遍即可得到flag。
简单分析下,实际上是循环用a2去减走s的数据。两者差值恰好在ASCII范围内,相减后直接转为字符类型即可。
疑点
ida反汇编得到的c代码中,用于flag数组下标的v4并没有初始化为0。
v4在栈中的地址是ebp-1Ch
而只有用于a2下标的var_18[ebp-18h]被初始化为0。
可能题目出现了错误,忘记初始化v4了。
网友评论