[WUSTCTF2020]Cr0ssfun-学习笔记
前置知识正文一、UPX脱壳二、IDA静态分析1、main函数反编译代码审计2、追踪 check() 函数链三、根据 check() 函数链调用链编写有效 Flag前置知识BUUCTF 新年快乐-学习笔记正文一、UPX脱壳查过了无壳。二、IDA静态分析1、main函数反编译代码审计IDA 进入后左侧Functions Window函数窗口可以看到所有函数。找到main函数并双击然后按F5键反编译。代码如下int__fastcallmain(intargc,constchar**argv,constchar**envp){_BYTE v4[48];// 存储用户输入的 flag// 打印 ASCII 艺术字忽略puts( _ _ _ _ _____ _____ _____ );// ...省略 bannerwhile(1){puts(Input the flag);__isoc99_scanf(%s,v4);// 读取用户输入if((unsignedint)check(v4)1)// 调用 check() 验证break;puts(0ops, your flag seems fake.);rewind(__bss_start);}puts(Your flag is correct, go and submit it!);return0;}逻辑很简单用户输入一个字符串 → 调用check()验证 → 正确则输出成功信息错误则继续循环。关键问题check()函数到底检查了什么条件2、追踪 check() 函数链check()只有一行代码__int64 __fastcallcheck(__int64 a1){returniven_is_handsome(a1);// 调用 iven_is_handsome}而iven_is_handsome里面又调用了iven_is_c0oliven_is_c0ol调用了iven_1s_educated…… 实际上这些函数形成了一条调用链check() → iven_is_handsome() → iven_is_c0ol() → iven_1s_educated() → iven_1s_brave() → iven_1s_great() → iven_and_grace() → finally_fun()从后往前逐一反编译每个函数esc键往前退回可以得到如下的位置→字符映射表finally_fun最后一环returna1[1]99a1[25]64a1[27]101;// 索引1 c 索引25 索引27 e可以用随波逐流工具验证一下a1的值也可以用 Python 的chr()函数转换。iven_and_gracereturna1[4]50a1[17]114a1[29]102a1[24]95finally_fun(a1);// 索引4 2 索引17 r 索引29 f 索引24 _iven_1s_greatreturna1[2]116a1[9]99a1[32]125a1[19]118a1[5]48a1[14]110iven_and_grace(a1);// 索引2 t 索引9 c 索引32 } 索引19 v 索引5 0 索引14 niven_1s_bravereturna1[15]100a1[8]123a1[18]51a1[28]95a1[21]114iven_1s_great(a1);// 索引15 d 索引8 { 索引18 3 索引28 _ 索引21 riven_1s_educatedreturna1[0]119a1[6]50a1[22]115a1[31]110a1[12]95iven_1s_brave(a1);// 索引0 w 索引6 2 索引22 s 索引31 n 索引12 _iven_is_c0olreturna1[7]48a1[16]95a1[11]112a1[23]101a1[30]117iven_1s_educated(a1);// 索引7 0 索引16 _ 索引11 p 索引23 e 索引30 uiven_is_handsomereturna1[10]112a1[13]64a1[3]102a1[26]114a1[20]101iven_is_c0ol(a1);// 索引10 p 索引13 索引3 f 索引26 r 索引20 e每个函数都做同一件事检查输入字符串的某些位置是否等于特定字符。三、根据 check() 函数链调用链编写有效 Flag用AI 编写脚本flag[]*33# finally_funflag[1]chr(99)# cflag[25]chr(64)# flag[27]chr(101)# e# iven_and_graceflag[4]chr(50)# 2flag[17]chr(114)# rflag[29]chr(102)# fflag[24]chr(95)# _# iven_1s_greatflag[2]chr(116)# tflag[9]chr(99)# cflag[32]chr(125)# }flag[19]chr(118)# vflag[5]chr(48)# 0flag[14]chr(110)# n# iven_1s_braveflag[15]chr(100)# dflag[8]chr(123)# {flag[18]chr(51)# 3flag[28]chr(95)# _flag[21]chr(114)# r# iven_1s_educatedflag[0]chr(119)# wflag[6]chr(50)# 2flag[22]chr(115)# sflag[31]chr(110)# nflag[12]chr(95)# _# iven_is_c0olflag[7]chr(48)# 0flag[16]chr(95)# _flag[11]chr(112)# pflag[23]chr(101)# eflag[30]chr(117)# u# iven_is_handsomeflag[10]chr(112)# pflag[13]chr(64)# flag[3]chr(102)# fflag[26]chr(114)# rflag[20]chr(101)# eprint(.join(flag))