-
-
[原创]青梅竹马 WriteUp from W8C.Cossack人人
-
发表于: 2019-3-16 01:52 2946
-
最终得到最小解0x1555d30f38b0dbcaec83c0f9L
最终得到PEDIy9102dreadyu,再加上程序对格式的要求,改为PEDIyV9102dVreadyu
module Main where initN :: (Integer, Integer) initN = (2, 5) primes :: [Integer] primes = filter (\k -> null [ x | x <- [2..k - 1], k `mod` x == 0]) [3..73] getNextN :: (Integer, Integer) -> Integer -> (Integer, Integer) getNextN (n1, n2) m = case take 2 $ filter (f m) [n1, n2..] of ~[a, b] -> (a, b) where f :: Integer -> Integer -> Bool f m x = x ^ 83 `mod` m == 2 main :: IO () main = print $ fst $ foldl getNextN initN primes
package main import ( "encoding/base64" "fmt" ) const ( base64Table = "ABCyVPGHTJKLMNOFQRSIUEWDYZgbc8sfah1jklmnopqret5v0xX9wi234u67dz+/" ) var coder = base64.NewEncoding(base64Table) func base64Encode(src []byte) string { return coder.EncodeToString(src) } func main() { dec := "\x15\x55\xd3\x0f\x38\xb0\xdb\xca\xec\x83\xc0\xf9" fmt.Println([]byte(dec)) plain := base64Encode([]byte(dec)) fmt.Println(plain) }
- 先进入sub_402562,校验输入字符串格式,并通过魔改的base64解密字符串,传入sub_4024e1
- 在sub_4024e1,生成素数表,获取3-73之间素数乘积,和base64解码数据一起传入sub_4020f1
- sub_40206d为大数取模函数,sub_4017af为大叔相乘函数,学过信安数基的都知道,这里很明显是个高阶同余方程。
- 同余方程解被sub_4021a7调用,而sub_4021a7是取出余数的函数
- 通过取出的余数判断是否正确。进ollydbg强改数据发现余数是2的时候才能correct
- 综上,整个程序逆向完成。问题总结为:x^83 == 2(mod20364840299624512075310661735)(此处手推循环。。累死)
- 详情参考附件
- 利用步进的方法搜索可能的答案。
- 记y=x^83而n=3到73中所有素数的积,有y%n=2,所以对每一个在3到73中的素数p都有n%p=2。
- 使p取遍3到73上的素数。
- 先求解y%3=2的解,得到一个解集;再从中筛选出符合y%5=2的;再y%7=2的等等(由于这样的解是线性分布的所以可以依次筛,而且相当方便)。
- 最后会得到一个解集,取最小的数即可。
- 此处hs的实现使用了一个元组来表示解集。元组的两个元素分别是解集中最小的两个解。
- 直接将新的base64码表传入构造函数NewEncoding(golang真优秀)
- 解码上文haskell代码解密得到的数据(已转string)
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2019-3-16 01:57
被Cossack人人编辑
,原因: 补充内容
赞赏
他的文章
谁下载
无
看原图
赞赏
雪币:
留言: