# 攻防世界—no-strings-attached
介绍下——IDA内置脚本 shift+F12
收获——要一个一个大致看出代码在干嘛
先运行一遍
`int __cdecl main(int argc, const char **argv, const char **envp)
{
setlocale(6, &locale);
banner();
prompt_authentication();
authenticate();
return 0;
}`
进来函数后F5
一个一个函数看,对应运行结果
setlocale——看不出来
banner——
time是时间种子,用来给rand用来随机的
wprintf我们看一下
可以发现就是最开始的显示的
同理可以发现后面也是题目提示
prompt_authentication——输出那个please的
authenticate——这个肯定就是flag关键了
```void authenticate()
{
int ws[8192]; // [esp+1Ch] [ebp-800Ch] BYREF
wchar_t *s2; // [esp+801Ch] [ebp-Ch]
s2 = decrypt((wchar_t *)&s, (wchar_t *)&dword_8048A90);
if ( fgetws(ws, 0x2000, stdin) )stdin就是输入缓冲区,fgetws类似于input
{
ws[wcslen(ws) - 1] = 0;最后一个字符是不是0
if ( !wcscmp(ws, s2) )比较,这个ws是我们输入的,说明s2就是给的flag
wprintf((int)&unk_8048B44);进入发现给success
else
wprintf((int)&unk_8048BA4);
}
free(s2);
}
```
不要在后面下断点,中间进行了数据清理
我们就在s2刚刚形成的时候就去看
你鼠标指向s2,他会给你一个地址
0x09888FE0
在
这里按箭头跟进
![flag](vx_images/411464422258190.png)
可以看见这个就是flag,但是我们提取有困难
![
在下面就会给我们新提取的
方法二:shift+f2
```import idc
v = [idc.get_wide_byte(0x09725FDC + i * 4) for i in range(100)]
print(bytes(v))
```
0x09725FDC这个是地址头,i是偏移地址,range因为我们不知道数据有多少,就大一点