[原创]第四题 密界寻踪 WriteUp
发表于:
2018-6-22 18:28
3775
用IDA载程序,发现程序中存在一些跳来跳去的花指令。手动让IDA正确识别指令之后,发现所有的自定义函数都在内部做了call导致反编译只能识别出JUMPOUT。这里我使用一种比较邪门的patch方法,在IDA数据库中将CALL改为JMP,但是不将补丁应用到二进制文件 ,打断点时避免打到这些数据库中和二进制中不一样的地址,这样可以保证程序的正常运行,又可以使用IDA的源码级调试。
main函数:
程序似乎应该是有一个反调试的,如果挂上调试器的话得到的结果应该会有问题。不过在我测试的时候,似乎……并没有用?= =
程序中栈上的很多字符串都是利用异或1到n动态解密的,这个调试一下就能拿到。
程序使用了MIRACL密码库,还原函数名搞得我脑壳疼 = = MIRACL这个库比较老,官方只给出了编译成静态Lib的方法,并不能编译成DLL。用VS编译搞出来obj文件扔进bindiff,发现函数的识别率特别低。程序查一下链接器,这里要膜一下出题人,发现居然是用VC++6.0写的……正好做题的时候遇上上机实验,到学校机房的VC++6.0环境编译MIRACL,搞出几十个obj文件拷回去,一个一个建IDB,bindiff载……搞了一个多小时,终于还原了大部分函数。
程序中用到的两个最关键的算法是RSA和AES密码算法,Flag前3位给AES函数,后面的给RSA函数。所以这道题叫“密”界寻踪啊2333333
RSA函数:
可以看到是一个非常正常的powmod算法,也正是RSA算法的核心,传入的Flag是以十六进制形式,n、e和密文都可以提取出来。
AES算法:
使用了MIRACL库内置的AES算法,密文可以提取,明文是pediy加上11个零字节,密钥为输入的Flag的前三位(其中最后一位+1)(要求都是数字)拼上1314000000000. // 似乎原本如果挂调试器的话这里的+1会变成+2导致结果不正确?
作为N的数字并不是很大,到factordb.com这个网站上寻找因子分解,得到N= 208096057845685678782766058500526476379 × 273086345401562743300402731618892888991,即为两个大素数p × q,那么可以求得私钥d为e对于(p-1)×(q-1)的逆元,再利用解密规则p = c ^ d mod n求得明文。
程序要寻找一个正确的AES密钥,没什么方法,只能爆破。一共只有3位数字,计算量不大。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)