首页
社区
课程
招聘
[原创]第四题 密界寻踪 WriteUp
发表于: 2018-6-22 18:28 3775

[原创]第四题 密界寻踪 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期)

收藏
免费 1
支持
分享
最新回复 (2)
雪    币: 2688
活跃值: (173)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
大佬带带我
2018-11-22 21:15
0
雪    币: 102
活跃值: (462)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
为什么我有一种公司招人做测试的感觉
2018-11-22 21:42
0
游客
登录 | 注册 方可回帖
返回
//