1625-5 王子昂 总结《2017年9月15日》 【连续第348天总结】
A. 问鼎杯题库-逆向
B.
小磊生病了
题目:小磊生病了,医生检查出小磊体内有两种有害病菌B和C是引发的关键,同时也找到的消灭病菌的有益菌A ,现在要你帮助A战胜B和C,治好小磊,小磊会告诉你flag是什么。
直接运行会显示Andy,Bob,Carl三种菌的数量
观察代码结构可以发现最后flag的生成处:
很明显,当通过了23次循环以上时,会以v24数组的值作为下标来打印neFO字符串
分别将两个数组复制下来进行处理,得到flag:
s = "neFolieIhrTHe"
h = [2, 5, 9 ,6 ,7 ,0 ,10 ,8 ,12 ,11 ,3 ,4 ,1]
for i in h:
print(s[i], end='')
FireInTheHoLe
还可以爆破:
00A31297 . /75 36 jnz short qqqq.00A312CF
00A31299 . |8BBD 60FFFFFF mov edi,dword ptr ss:[ebp-0xA0] ; di=v23,循环量
00A3129F . |33F6 xor esi,esi
00A312A1 . |85FF test edi,edi
00A312A3 . |7E 2A jle short qqqq.00A312CF
00A312A5 . |EB 09 jmp short qqqq.00A312B0
00A312A7 . |8DA424 000000>lea esp,dword ptr ss:[esp]
00A312AE . |8BFF mov edi,edi
00A312B0 > |8B94B5 64FFFF>mov edx,dword ptr ss:[ebp+esi*4-0x9C] ; 选取flag字符
00A312B7 . |0FBE4415 B0 movsx eax,byte ptr ss:[ebp+edx-0x50]
00A312BC . |50 push eax
00A312BD . |68 48BAA300 push qqqq.00A3BA48 ; %c
00A312C2 . |E8 14010000 call <qqqq.Print> ; 输出
00A312C7 . |46 inc esi
00A312C8 . |83C4 08 add esp,0x8
00A312CB . |3BF7 cmp esi,edi
00A312CD .^|7C E1 jl short qqqq.00A312B0
00A312CF > \68 4CBAA300 push qqqq.00A3BA4C ; pause
00A312D4 . E8 25000000 call qqqq.00A312FE
直接将EIP改到这里00A31299即可
注意要在初始化赋值工作进行之后,否则堆栈中无这些局部变量
edi要手动写入23,因为我们未合法进行若干次循环
esi注意要执行清空置0,否则Print不从第0个开始
同样能得到flag
至于算法
粗略地分析了一下,整个程序一共有三层循环:
第一层随机生成数
第二层依次比较第一名、第二名和第三名
第三层交换名称和值
最复杂的三个第四层循环是写入字符串用的,分别为tmp=a,a=b, b=tmp
最后验证是否第一名(即值最高的)为益生菌Andy,是则继续循环,不是则直接结束
如果Andy连续胜利23次以上则输出flag
嗯……概率有点感人哈,不过好像还是有可能的 不像掷骰子要求7那种完全没戏
反正就是要求爆破咯╮(╯_╰)╭
C. 明日计划
问鼎杯正赛