XCTF 攻防世界 Reverse新手题(no-strings-attached)
和之前的题目一样,先用exeinfoPE查看一下文件有没有被加壳,发现并没有加壳,并且是一个32位的elf文件
接下来,直接用IDA32打开即可,先找main函数,F5反编译查看源代码:
int __cdecl main(int argc, const char **argv, const char **envp)
{
setlocale(6, &locale);
banner();
prompt_authentication();
authenticate();
return 0;
}
若无线索,可以先一个函数一个函数的看过去,可以发现在authenticate()里有一个decrypt函数,猜测可能跟flag有关:
void authenticate()
{
int ws[8192]; // [esp+1Ch] [ebp-800Ch]
wchar_t *s2; // [esp+801Ch] [ebp-Ch]
s2 = decrypt(&s, &dword_8048A90);
if ( fgetws(ws, 0x2000, stdin) )
{
ws[wcslen(ws) - 1] = 0;
if ( !wcscmp(ws, s2) )
wprintf(&unk_8048B44);
else
wprintf(&unk_8048BA4);
}
free(s2);
}
之后,可以试一下动态调试,用Linux下的gdb,很方便
gdb 文件名
即可进入到gdb调试界面
b decrypt
在decrypt函数处设置断点
r
r是运行命令,运行到断点处停止
n
往前运行一步
之后,可以看一下寄存器的状态:info reg
可以看到eflags,对应的地址为0x282
直接x/282wx $eax
即可
查看eax寄存器是因为,在汇编代码中双击decrypt后,可以看到数据是添加到eax寄存器的
最后,0x00000000代表字符串的结束,因此将前面的十六进制数提取出来,依次连接起来,编写exp如下:
key = '3934...'
flag = key.decode('hex')
print(flag)
至此,最终就可以得到flag了