Rsa(20)
这里有一个Rsa算法
首先来讲一下这个算法的基本原理和加密过程和解密过程
首先我们要知道的是:什么是加密解密
这个就是基本rsa加密啦
1234567891011121314import hashlibimport gmpy2import rsap = 285960468890451637935629440372639283459q = 304008741604601924494328155975272418463e = 65537n = 86934482296048119190666062003494800588905656017203025617216654058378322103517d = gmpy2.invert(e,(q-1)*(p-1))print(d)
12345678910111213141516171819import hashlibimport gmpy2import rsap = 285960468890451637935629440372639283459q = 304008741604601924494328155975272418463e = 65 ...
软件加固简单介绍
知道如何加固的才能更好的破解
加固思路或者方法
常量保护
软件中的字符串常量,提前经过转化存储,避免明文存放。将字符串通过简单加密后存储就可以了。分析一个加密过程是一个比较耗时的。如果加密成byte,将更难分析
数据加密传输
完全避免明文传输数据,加密强度高,算法够安全,密文和明文不可逆加密【比如RSA算法】
核心数据分开存储
避免数据和软件放在一起。比如QQ,数据都是QQ服务器存放着的。
各种暗装
暗装是网络验证系统必不可少的一环,在恰当的时机进行验证。如果数据被篡改就终止运行
加强程序强度
防止被调试
加壳
加壳就相当于穿上战甲。战甲越牛,越不容易被破解
增加破解成本
时间,金钱…
利用法律
自己破自己
将破解的软件发布出来,然后软件照常使用,当满足某个条件的时候【数据量超过xx条】锁死数据库,只能购买正版解锁
自己破自己
发布假的破解版…
避免直接寻址
由于Bin文件被反汇编之后成为汇编代码,如果只直接寻址(例如寻址到UID密文0X11111111地址上的数据)那么被寻址的地址是直接在汇编代码上可以看到的,直接通过查找功能就可以锁定读取密文的 ...
Hook - frida(43)
官网!!
https://frida.re/
https://github.com/frida/frida
这里用笔记本来hook一下
首先是打开笔记本,然后运行这个程序1.py
python 1.py
还有一种就是,你写好的程序f.exe
然后再与 f.exe 相同的目录下 写一个python脚本
12345678910111213141516from __future__ import print_functionimport fridaimport syssession = frida.attach("f.exe") # 程序名script = session.create_script("""Interceptor.attach(ptr("%s"), {onEnter: function(args) {send(args[0].toInt32());}});""" % int(sys.argv[1], 16))def on_message ...
what is hook?(42)
Hook技术首先了解一下Hook技术
Hook就是钩子,用于劫持消息。
Win32 是一个消息机制为基础的。整个系统都是通过消息传递实现的
hook(钩子)是一种特殊的消息处理机制,它可以监视系统或者进程中的各种事件消息,截获发往目标窗口的消息并进行处理。所以说,我们可以在系统中自定义钩子,用来监视系统中特定事件的发生,完成特定功能。
钩子类型:
系统级钩子:在操作系统级别拦截和修改系统事件,如键盘输入、鼠标移动等。系统级钩子可以用于实现全局热键、记录输入、监视和控制系统行为等。
应用程序级钩子:在特定应用程序中拦截和修改特定事件,如按钮点击、窗口消息等。应用程序级钩子可以用于定制特定应用程序的行为,添加自定义功能或监视应用程序的状态。
钩子用途:
修改行为:通过钩子技术,可以拦截和修改特定功能的行为,以满足特定需求。例如,可以使用钩子来修改应用程序的用户界面、增加特定功能或屏蔽不需要的行为。
监视事件:通过钩子,可以监视和记录特定事件的发生,以进行调试、故障排除或数据分析。例如,可以使用钩子来监视应用程序的网络通信、用户操作等,并记录相关信息。
增强安全性:钩子技术可以用于实施 ...
rome(19)
1*((_BYTE *)v1 + *(_DWORD *)&v12[17]) = (*((char *)v1 + *(_DWORD *)&v12[17]) - 51) % 26 + 65
(某个数-51)%26+65
Q的ascii是81
67就是“C”
最后通过写python脚本
123456789101112x = [81,115,119,51,115,106,95,108,122,52,95,85,106,119,64,108]flag=''for i in range(16): for j in range(0,127): z = j if j > 64 and j <= 90: j = (j - 51) % 26 + 65 if j > 96 and j <= 122: j = (j - 79) % 26 + 97 if(j==x[i]): flag+=chr(z)print(flag ...
find it (18)
不知不觉,小明长大了,变成了一个程序员,虽然很苦逼,但是偶尔编写个小东西坑害公司新人还是蛮好玩的。新人小萌一天问小明wifi账号密码,一分钟后,小萌收到了一个文件。小萌想了好久都没得到密码,怎么办,女朋友要买东西,流量告罄,没wifi上不了网,不买就分手,是时候该展现月老的实力了兄弟们!代表月亮惩罚小明!得出答案。 注意:得到的 flag 请包上 flag{} 提交
用jeb打开然后搜索一下flag 找一找
然后就找到了这里
看到有
this.findViewById(0x7F05003D).setOnClickListener(new View$OnClickListener(new char[]{‘T’, ‘h’, ‘i’, ‘s’, ‘I’, ‘s’, ‘T’, ‘h’, ‘e’, ‘F’, ‘l’, ‘a’, ‘g’, ‘H’, ‘o’, ‘m’, ‘e’}, this.findViewById(0x7F05003E), new char[]{‘p’, ‘v’, ‘k’, ‘q’, ‘{‘, ‘m’, ‘1’, ‘6’, ‘4’, ‘6’, ‘7’, ‘5’, ‘2’, ‘6 ...
ACTF新生赛2020 easyre(17)
下载发现是一个含有upx壳的文件
直接脱掉就好了,用upx工具
然后用IDA打开
一下子就找到了位置
大概看一下就知道:
1qmemcpy(v4, "*F'\"N,\"(I?+@", sizeof(v4));
这个是在v4里面拷贝字符串
然后下面用v4中的字符串 要和 _data_start _ 这个数组中通过v5+i-1的值来相等
通过经验可得到找到的这个v5+i-1的值应该就是我们的flag
点过去就知道这个数组中的值
现在就是要逆向这串代码
1( v4[i] != _data_start__[*((char *)v5 + i) - 1] )// 要相等
仔细看 *((char *)v5 + i) == v5[i]
12345_data_start__[*((char *)v5 + i) - 1] == _data_start__[v5[i] - 1]也就是说v4[i]的值要和_data_start__[v5[i]-1]的值一样这个v5[i]-1 是一个索引值这个v5才是flag
总体来说,这个表达式的含义是:将 ...
希尔排序
希尔排序也就是改进的插入排序
希尔排序首先就是找出一个间隔,在通过这个间隔来排序,依次往后加
比如间隔是4
第一次就排0,4,8,12,…
第二次就排1,5,9,13…
然后减小间隔,再重复上面的过程,最后一定会有一次间隔为1的时候。
优点
在间隔大的时候,排序次数少
在间隔小的时候,排序距离近
比普通插入效率高,但是不稳定。
大体中间内容就是选择排序,不过下标不在是i
而是gap【间隔】
这里就面临着间隔如何选择的问题
二分,一半的一半的一半
Knuth序列
h=1,最后一次间隔为1
h=3*h+1,每运行一次就是一个新的间隔
找到最大的h然后依次递减,一直到1
最后我写copy的代码
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263#include<stdio.h>//用于打印的函数void print(int arr[],int size) { in ...
BugKu-gctf_mobile2
emmmm
打开解压
然后就看到了flag….
有点蒙蔽…
看了网上的WP也是用的010
这里我没用都看到了….
BugKu-gctf_mobile1
打开这个文件
首先是一个apk文件
也就是安卓文件,然后用jeb逆向看看。
主要的代码就是这里:
123456789101112131415161718if(arg12.length() != 22) { return v7; } MessageDigest v1 = MessageDigest.getInstance("MD5"); v1.reset(); v1.update(arg11.getBytes()); String v3 = MainActivity.toHexString(v1.digest(), ""); StringBuilder v5 = new StringBuilder(); int v4; for(v4 = ...