[CISCN2018]crackme-java

题目

import java.math.BigInteger;
import java.util.Random;public class Test0 {static BigInteger two =new BigInteger("2");static BigInteger p = new BigInteger("11360738295177002998495384057893129964980131806509572927886675899422214174408333932150813939357279703161556767193621832795605708456628733877084015367497711");static BigInteger h= new BigInteger("7854998893567208831270627233155763658947405610938106998083991389307363085837028364154809577816577515021560985491707606165788274218742692875308216243966916");/*Alice write the below algorithm for encryption.The public key {p, h} is broadcasted to everyone.@param val: The plaintext to encrypt.We suppose val only contains lowercase letter {a-z} and numeric charactors, and is at most 256 charactors in length.*/public static String pkEnc(String val){BigInteger[] ret = new BigInteger[2];BigInteger bVal=new BigInteger(val.toLowerCase(),36);BigInteger r =new BigInteger(new Random().nextInt()+"");ret[0]=two.modPow(r,p);ret[1]=h.modPow(r,p).multiply(bVal);return ret[0].toString(36)+"=="+ret[1].toString(36);}/* Alice write the below algorithm for decryption. x is her private key, which she will never let you know.public static String skDec(String val,BigInteger x){if(!val.contains("==")){return null;}else {BigInteger val0=new BigInteger(val.split("==")[0],36);BigInteger val1=new BigInteger(val.split("==")[1],36);BigInteger s=val0.modPow(x,p).modInverse(p);return val1.multiply(s).mod(p).toString(36);}}*/public static void main(String[] args) throws Exception {System.out.println("You intercepted the following message, which is sent from Bob to Alice:");System.out.println("eag0vit7sboilgcfu0fbkbrmjgs4pzi2oznmqrkey5h1bwicvborngscx050u8vpghi69xqjmotgrtj4vq8fgw9tzi916o034bu==ahcwy7c0qq5cnxdntssqrj972nhvzt5liqlq0cvv0o1fm2ee4205nemuy5tvkda0hyetu5a5xcqqov8exk901z5xebvkcdo3jiq1gj8pkxzhjaeg9z6syu58neijxy56am7d1l9grhgtgkkfc432wm6h3jr8y1xx");System.out.println("Please figure out the plaintext!");}
}//eag0vit7sboilgcfu0fbkbrmjgs4pzi2oznmqrkey5h1bwicvborngscx050u8vpghi69xqjmotgrtj4vq8fgw9tzi916o034bu==ahcwy7c0qq5cnxdntssqrj972nhvzt5liqlq0cvv0o1fm2ee4205nemuy5tvkda0hyetu5a5xcqqov8exk901z5xebvkcdo3jiq1gj8pkxzhjaeg9z6syu58neijxy56am7d1l9grhgtgkkfc432wm6h3jr8y1xx

解题

您截获了以下由Bob发送给Alice的消息:请找出明文!

Alice编写以下加密算法。
公钥{p,h}向每个人广播。
@param val:要加密的明文。
我们假设val只包含小写字母{a-z}和数字字符,长度最多为256个字符。

toLowerCase() 方法用于把字符串转换为小写。

Random().nextInt() 生成随意整数

.modPow() 大数快速幂取模

.multiply(val)乘val

.modInverse(BigInteger m) 返回一个BigInteger,其值是 (this-1 mod m).

public boolean contains(CharSequence chars)参数chars – 要判断的字符或字符串。返回值:如果包含指定的字符或字符串返回 true,否则返回 false。

toString(i) 方法用于返回以一个字符串表示的 Number 对象值。如果方法使用了原生的数据类型作为参数,返回原生数据类型的 String 对象值。如果方法有两个参数, 返回用第二个参数指定基数表示的第一个参数的字符串表示形式。参数i – 要转换的整数。返回值toString(): 返回表示 Integer 值的 String 对象。toString(int i): 返回表示指定 int 的 String 对象。

还是比较习惯用Python,题目给出的代码翻译成python差不多是

import gmpy2two = 2
p = 11360738295177002998495384057893129964980131806509572927886675899422214174408333932150813939357279703161556767193621832795605708456628733877084015367497711
h = 7854998893567208831270627233155763658947405610938106998083991389307363085837028364154809577816577515021560985491707606165788274218742692875308216243966916def pkEnc(val):bVal = val.lower()#val是明文r = random()+' 'ret = [pow(two,r,p),pow(h,r,p)*bVal]return ret[0]==ret[1]def skDec(val,x):if(not '==' in val):returnelse:val0 = val.split('==')[0]val1 = val.split('==')[1]s = gmpy2.invert(pow(val[0],x,p),p)return pow(val1*s,p)#c = eag0vit7sboilgcfu0fbkbrmjgs4pzi2oznmqrkey5h1bwicvborngscx050u8vpghi69xqjmotgrtj4vq8fgw9tzi916o034bu==ahcwy7c0qq5cnxdntssqrj972nhvzt5liqlq0cvv0o1fm2ee4205nemuy5tvkda0hyetu5a5xcqqov8exk901z5xebvkcdo3jiq1gj8pkxzhjaeg9z6syu58neijxy56am7d1l9grhgtgkkfc432wm6h3jr8y1xx

读完程序来解题

爆破r来解:

from threading import Thread
import base36p=11360738295177002998495384057893129964980131806509572927886675899422214174408333932150813939357279703161556767193621832795605708456628733877084015367497711
c1=int('a9hgrei38ez78hl2kkd6nvookaodyidgti7d9mbvctx3jjniezhlxs1b1xz9m0dzcexwiyhi4nhvazhhj8dwb91e7lbbxa4ieco',36)def calr(r0,pid):print("[Process%d]: start from %d" % (pid, r0))while r0 < 2**26*(pid+1):if pow(2,r0,p) == c1:f = open('r','w')f.write(r0)exit(0)r0+=1if r0 % 2**18 == 0:print('[Process%d]: now %d' % (pid, r0))print('[Process%d]: exited!' % pid)for i in range(0,32):t = Thread(target=calr,args=(i*2**26,i))t.start()
#152351913c2 = int('2q17m8ajs7509yl9iy39g4znf08bw3b33vibipaa1xt5b8lcmgmk6i5w4830yd3fdqfbqaf82386z5odwssyo3t93y91xqd5jb0zbgvkb00fcmo53sa8eblgw6vahl80ykxeylpr4bpv32p7flvhdtwl4cxqzc', 36)
h = int("7854998893567208831270627233155763658947405610938106998083991389307363085837028364154809577816577515021560985491707606165788274218742692875308216243966916")print(base36.dumps(c2//pow(h,r,p)))
#ciscncongratulationsthisisdesignedbyalibabasecurity424218533

[CISCN2018]crackme-java相关推荐

  1. Java逆向基础之简单的补丁

    本文参考:http://www.vuln.cn/7118 本文参考:<Reverse Engineering for Beginners>Dennis Yurichev著 本文需要用到ID ...

  2. java获取内存基址_安卓逆向|菜鸟的FRIDA学习笔记:内存读写

    假设你的手机已经root,并已开启frida服务,电脑端已安装好Python,frida,IDA,GDA. 样本地址: 链接: https://pan.baidu.com/s/1y3kIXcBv25Q ...

  3. frida的用法--Hook Java层类方法

    frida是一款方便并且易用的跨平台Hook工具,使用它不仅可以Hook Java写的应用程序,而且还可以Hook原生的应用程序. 1. 准备 frida分客户端环境和服务端环境.在客户端我们可以编写 ...

  4. 转载:使用 Frida 来 hook 加固的 Android 应用的 java 层

    Android 加固应用Hook方式 --- Frida:https://github.com/xiaokanghub/Android 转载:使用 frida 来 hook 加固的 Android 应 ...

  5. 安卓逆向_24( 一 ) --- Hook 框架 frida( Hook Java层 和 so层) )

    From:Hook 神器家族的 Frida 工具使用详解:https://blog.csdn.net/FlyPigYe/article/details/90258758 详解 Hook 框架 frid ...

  6. 安卓逆向_21 --- Java层和so层的反调试( IDA 动态调试 JNI_OnLoad、init_array下断)

    1. 安卓程序动态调试条件 安卓程序动态调试条件 ( 2个满足1个即可 ): 1. 在 AndroidMainfest.xml ---> application 标签下,设置或者添加属性 and ...

  7. Android 逆向笔记 —— 一个简单 CrackMe 的逆向总结

    温馨提示 请拖动到文章末尾,长按识别「抽奖」小程序. 在我的印象中,懂逆向的,都是大牛,让我们一起来看看下面这位大牛的学习心得. 无意中在看雪看到一个简单的 CrackMe 应用,正好就着这个例子总结 ...

  8. android classes2.dex,原创??近乎完美解决AndroidKiller不提取classes2+.dex JAVA源码的问题...

    本帖最后由 NoZuoNo代 于 2019-12-23 11:00 编辑 入坛多年了,还是第一次发帖(大家不要以为是我低调,而是  我太白了简直纯白不知道发什么 )  没想到多年前还是个小白的我现如今 ...

  9. crackme例子2

    样本 jadx clacSnFuntion jni函数,ida分析 关键位置函数一片红色,可能有动态加解密 如果不分析具体解密算法,可内存dump解密后整个so frida如下: function d ...

最新文章

  1. 一次上机试题(面向对象)
  2. 防火墙简单组网方案之双机热备
  3. zoj 3696 Alien's Organ(泊松分布)
  4. html5中表格如何等分,纯css3饼图五等分
  5. AVL添加平衡二叉树,是一种二叉排序树,其中每个结点的左子树和右子树的高度差至多等于1。-icoding-数据结构-C-typedef struct node{ int val;
  6. 内是不是半包围结构_轻钢别墅的体系结构
  7. 用ubuntu远程连接mysql_Ubuntu 安装 MySQL 和远程连接
  8. WSUS补丁服务器部署详细 利用WSUS部署更新程序
  9. 数据归一化的作用--在svm 训练的时候特别有用
  10. 自动化测试框架selenium+java+TestNG——配置篇
  11. Testin云测平台使用
  12. 聊聊DevOps制品管理-不止是存储制品这么简单
  13. 中国34个省未来发展趋势深度分析
  14. 基于Java毕业设计研究生招生信息管理源码+系统+mysql+lw文档+部署软件
  15. 2062【例1.3】电影票-一 c++语言入门-c++语言
  16. The environmenthvariable 'Path' seems to ave some paths containing characters (';', '' or ';;').
  17. js,jq,锚点 分别实现返回顶部
  18. 【喜报】“深度强化学习实验室”战略合作伙伴”南栖仙策“完成Pre-A轮融资,高瓴创投领投
  19. 计算机丢失quartz.dll什么意思,教你win10系统quartz.dll丢失找不到指定模块的解决教程...
  20. 计算机中丢失 api-ms-win-crt-runtime-l1-1-0.dll解决办法

热门文章

  1. 你真的认识 “ 数据中心网络 ” 吗?
  2. Equinix 位于伦敦的LD8数据中心发生严重故障
  3. 数据中心成“香饽饽”:阿里云未来再投2000亿,板块内掀起涨停潮
  4. 数据网络卡顿怎么处理_监控网络卡顿怎么办
  5. dcdc模块降额设计_模块电源应用设计的可靠性和注意事项
  6. 用php写shell,php与shell实现多线程的简单例子
  7. Python编程语言学习:在for循环中如何同时使用2个变量或者3个变量
  8. 成功解决building ‘snappy._snappy‘ extension error: Microsoft Visual C++ 14.0 is required. Get it with “B
  9. Paper:2017年的Google机器翻译团队《Transformer:Attention Is All You Need》翻译并解读
  10. DayDayUp:朋友圈有趣的职场跳槽微小说《华为跳阿里→阿里跳腾讯→腾讯跳百度→百度跳华为》