网鼎杯青龙组re_joker
2020-05-23 11:36:45 Author: bbs.pediy.com(查看原文) 阅读量:456 收藏

[原创]网鼎杯青龙组re_joker

4天前 331

进入main,发现无法F5,提示栈帧错误,调整栈帧,可以正常反编译

可以明显看到输入的值拷贝到"v5",并且原始的值会经过wrong,omg两个函数,最后v5进入encrypt,该函数时一个自加密的函数,等v5不等与0的时候进入finally

这里发现,wrong,omg都是错误的路径,与解题并没有太大关系,encrypt与finally都没有办法正常分析,都是错误的函数,这里就要考虑解密自加密的函数了,算法比较简单,直接异或了0x41,这里直接使用idapython脚本Patch一下,就可以分析了

import idaapi

addr = 0x401500

for i in range(0,186):
    re = Byte(addr+i) ^ 0x41
    PatchByte(addr+i,re)

这里经过Patch的函数,进入里面将数据转换为代码(快捷键为“c”),这里用Editer->Function->delete Function -> create Function,ida默认识别的函数会有错误,因此删除再重新创建一个,最终两个函数可以正常分析

分析encrypt函数,需要让第一个式子成立,才能最终让输入的flag进入finally。

编写脚本,可以得到第一个式子的输入。

import idaapi

addr = 0x404012
addr_d = 0x403040
re = ""
for i in range(0,19):
    re = re + chr(Dword(addr_d+i*4) ^ Byte(addr+i))
print re //flag{d07abccf8a410c

这里发现接触来的输入是19个字符,与一开始要求输入的24个还差了5个。这时候进入分析finally。

可以看到给了5个值,但是都没用,这一段程序就是拿输入的第一个字符去参与if ( (*a1 != 0x25) == v72 )的判断,这是发现v72返回的是一个1~100的随机数,然而第一个字符不等于“%”时将等于1,然后再去与v72比较是否相等。

这个时候就陷入沉思了,发现这段代码并没由实际的作用,又分析了汇编,发现还是一样的逻辑。最后定位再了这5个值上,19+5==24刚好满足,最后猜测flag的最后一位时“}”,因此求出异或的值

最终flag拼接上就出来了

[培训]科锐逆向工程师培训班38期--远程教学预课班将于 2020年5月28日 正式开班!


文章来源: https://bbs.pediy.com/thread-259594.htm
如有侵权请联系:admin#unsafe.sh