AVALON 强网杯 2019 强网先锋 ad(c) write up

强网先锋 ad(c) write up

环境配置

系统 : Linux kali 4.15.0-kali2-amd64 \ win10 64bit
程序 : task_qwxf_DS0zYpc
要求 : 输入口令
使用工具 :ida pro

开始分析

拿信息

文件拿到手直接改权限运行:

➜  playground chmod 744 task_qwxf_DS0zYpc 
➜  playground ./task_qwxf_DS0zYpc 
=== Strong Network Pioneer === 


123
you're not

要求输入一个字符串。

静态分析

ida载入程序,主流程如下:

__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
  char v4[128]; // [rsp+0h] [rbp-150h]
  char v5; // [rsp+80h] [rbp-D0h]
  char v6; // [rsp+81h] [rbp-CFh]
  char v7; // [rsp+82h] [rbp-CEh]
  char v8; // [rsp+83h] [rbp-CDh]
  char v9; // [rsp+84h] [rbp-CCh]
  char v10; // [rsp+85h] [rbp-CBh]
  char v11; // [rsp+86h] [rbp-CAh]
  char v12; // [rsp+87h] [rbp-C9h]
  char v13; // [rsp+88h] [rbp-C8h]
  char v14; // [rsp+89h] [rbp-C7h]
  char v15; // [rsp+8Ah] [rbp-C6h]
  char v16; // [rsp+8Bh] [rbp-C5h]
  char v17; // [rsp+8Ch] [rbp-C4h]
  char v18; // [rsp+8Dh] [rbp-C3h]
  char v19; // [rsp+8Eh] [rbp-C2h]
  char v20; // [rsp+8Fh] [rbp-C1h]
  char v21; // [rsp+90h] [rbp-C0h]
  char v22; // [rsp+91h] [rbp-BFh]
  char v23; // [rsp+92h] [rbp-BEh]
  char v24; // [rsp+93h] [rbp-BDh]
  char v25; // [rsp+94h] [rbp-BCh]
  char v26; // [rsp+95h] [rbp-BBh]
  char v27; // [rsp+96h] [rbp-BAh]
  char v28; // [rsp+97h] [rbp-B9h]
  char v29; // [rsp+98h] [rbp-B8h]
  char v30; // [rsp+99h] [rbp-B7h]
  char v31; // [rsp+9Ah] [rbp-B6h]
  char v32; // [rsp+9Bh] [rbp-B5h]
  char v33; // [rsp+9Ch] [rbp-B4h]
  char v34; // [rsp+9Dh] [rbp-B3h]
  char v35; // [rsp+9Eh] [rbp-B2h]
  char v36; // [rsp+9Fh] [rbp-B1h]
  char v37; // [rsp+A0h] [rbp-B0h]
  char v38; // [rsp+A1h] [rbp-AFh]
  char v39; // [rsp+A2h] [rbp-AEh]
  char v40; // [rsp+A3h] [rbp-ADh]
  __int64 v41; // [rsp+B0h] [rbp-A0h]
  __int64 v42; // [rsp+B8h] [rbp-98h]
  __int64 v43; // [rsp+C0h] [rbp-90h]
  __int16 v44; // [rsp+C8h] [rbp-88h]
  char v45; // [rsp+D0h] [rbp-80h]
  char *v46; // [rsp+140h] [rbp-10h]
  int i; // [rsp+14Ch] [rbp-4h]

  puts("=== Strong Network Pioneer === \n\n");
  __isoc99_scanf("%s", &v45);
  v41 = 7953769703030221169LL;
  v42 = 7954876941086586983LL;
  v43 = 7956005061827062375LL;
  v44 = 105;
  v5 = 'Z';
  v6 = 'm';
  v7 = 'x';
  v8 = 'h';
  v9 = 'Z';
  v10 = '3';
  v11 = 't';
  v12 = 't';
  v13 = 'Y';
  v14 = 'W';
  v15 = 'Z';
  v16 = 'h';
  v17 = 'a';
  v18 = '3';
  v19 = 'V';
  v20 = 'h';
  v21 = 'a';
  v22 = 'W';
  v23 = 'x';
  v24 = 'h';
  v25 = 'a';
  v26 = 'X';
  v27 = 'F';
  v28 = 'p';
  v29 = 'Y';
  v30 = 'W';
  v31 = '5';
  v32 = 'k';
  v33 = 'Y';
  v34 = 'W';
  v35 = '9';
  v36 = 'i';
  v37 = 'f';
  v38 = 'Q';
  v39 = '=';
  v40 = '=';
  v46 = &v45;
  sub_4005B7(&v45, v4);
  for ( i = 0; i <= 44; ++i )
  {
    if ( v4[i] != (unsigned __int8)*(&v5 + i) )
    {
      puts("you're not\n");
      return 0LL;
    }
  }
  puts("yes, you are!\n");
  return 0LL;
}
}

我手动把数据转变成字符(按下’r’),发现这是一个base64字符串。

逻辑推理

直接将数据从ida中拉出来,然后base64解码安排之。

编写程序

按照以上推理,将赋值数据保存成tmp文件:

  v5 = 'Z';
  v6 = 'm';
  v7 = 'x';
  v8 = 'h';
  v9 = 'Z';
  v10 = '3';
  .......

使用脚本解码:

import re,base64

f = open("./tmp","rb")
data = f.read()
f.close()

pattern = re.compile(r'\'.\'')
result1 = pattern.findall(data)
my_list = []

flag_en = ""
for STR in result1:
    flag_en += STR[1]

flag = base64.b64decode(flag_en)
print flag

assert flag == "flag{mafakuailaiqiandaob}"

夺旗成功

脚本运行结果为:

➜  playground python test.py
flag{mafakuailaiqiandaob}

提交给平台提示ok,拿了二血2333