版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android1Reverse400APK安装后为2048小游戏,玩到了3000多分跳转到一个界面要求输入flag,按按钮后返回判断结果。输入错误后需要等待一段时间才能再次输入。对APK进行逆向后可以看到按钮的处理函数如下:利用开发者签名的MD5为DES的秘钥用指纹证书MD5值作为秘钥对Asserts中x86目录下libListener进行DES解密,得到真正的可执行文件程序的主函数只有一个,利用字符串提示,倒序分析,发现有一处逐比特进行对比的函数。其中一部分是常量,另一部分可能是用户输入在前面处理后的结果:再往前看,其输入经过一个循环加密处理,在字符串常量中找到了连续的英文字母和数字以及’+’和’=’,可能是自定义后的Base64加密自定义base64之前的处理过程较为复杂先不管,写代码获取base64的预期输入:#include<stdio.h>charbase64char[]="GHgSTU45IMNesVlZadrXf17qBCJkxYWhijOyzbcR6tDPw023KLA8QEFuvmnop9+/";char*base64_decode(charconst*base64Str,char*debase64Str,intencodeStrLen){ inti=0; intj=0; intk=0; chartemp[4]=""; for(i=0;i<encodeStrLen;i+=4){ for(j=0;j<64;j++){ if(*(base64Str+i)==base64char[j]){ temp[0]=j; } } for(j=0;j<64;j++){ if(*(base64Str+i+1)==base64char[j]){ temp[1]=j; } } for(j=0;j<64;j++){ if(*(base64Str+i+2)==base64char[j]){ temp[2]=j; } } for(j=0;j<64;j++){ if(*(base64Str+i+3)==base64char[j]){ temp[3]=j; } } *(debase64Str+k++)=((temp[0]<<2)&0xFC)|((temp[1]>>4)&0x03); if(*(base64Str+i+2)=='=') break; *(debase64Str+k++)=((temp[1]<<4)&0xF0)|((temp[2]>>2)&0x0F); if(*(base64Str+i+3)=='=') break; *(debase64Str+k++)=((temp[2]<<6)&0xF0)|(temp[3]&0x3F); } returndebase64Str;}intmagic[32]={87,12,-13,-5,-14,15,-34,68,-3,-43,27,-22,13,-9,26,11,-67,36,-28,58,0,-60,64,-63,57,-57,17,2,11,-3,23,-49};intmain(){ inti,temp=0; chara,baseCode[32],resultCode[32]; for(i=0;i<32;i++) { temp+=magic[i]; a=temp&0xff; printf("%c",a); baseCode[i]=a; } base64_decode(baseCode,resultCode,32); printf("\n%s",resultCode); return0;} 运行结果如下,得到结果即为FLAGAndroid2Misc200#SMALI注入,获取DES加密密钥,并清除反调试Login.smali
const-stringv5,"SQL"
invoke-static{v5,v10},Landroid/util/Log;->v(Ljava/lang/String;Ljava/lang/String;)I
.line161
.endlocalv11
#"test":[B
:cond_1
:goto_2
invoke-interface{v3},Landroid/database/Cursor;->close()V
.line162
return-objectv10app$2.smali#virtualmethods
.methodpublicrun()V
.locals1
.prologue
.line105
iget-objectv0,p0,Lcom/zctf/app/app$2;->this$0:Lcom/zctf/app/app;
invoke-virtual{v0},Lcom/zctf/app/app;->getTaskId()I
move-resultv0
if-nez
v0,:cond_0app.smali
.line48
:goto_1
iget-objectv4,p0,Lcom/zctf/app/app;->dataProvider:Lcom/zctf/app/JNIclass;
const/4v5,0x2
invoke-virtual{v4,v6,v5},Lcom/zctf/app/JNIclass;->add(II)I
move-resultv4
if-eq
v4,v6,:cond_1#利用JAVA进行DES解密importjava.io.BufferedInputStream;importjava.io.ByteArrayOutputStream;importjava.io.DataOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.security.SecureRandom;importjavax.crypto.spec.DESKeySpec;importjavax.crypto.SecretKeyFactory;importjavax.crypto.SecretKey;importjavax.crypto.Cipher;publicclassDesDecrypt{publicDesDecrypt(){}//测试publicstaticvoidmain(Stringargs[])throwsIOException{//密码,长度要是8的倍数Stringpassword="zctf2016";byte[]result=toByteArray("C:\\Users\\LZ\\Desktop\\flag.bin");System.out.println("输入:");printHexString(result);//直接将如上内容解密try{byte[]decryResult=DES.decrypt(result,password);System.out.println("解密后:");printHextoChars(decryResult);}catch(Exceptione1){e1.printStackTrace();}}/***解密*@paramsrcbyte[]*@parampasswordString*@returnbyte[]*@throwsException*/publicstaticbyte[]decrypt(byte[]src,Stringpassword)throwsException{//DES算法要求有一个可信任的随机数源SecureRandomrandom=newSecureRandom();//创建一个DESKeySpec对象DESKeySpecdesKey=newDESKeySpec(password.getBytes());//创建一个密匙工厂SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance("DES");//将DESKeySpec对象转换成SecretKey对象SecretKeysecurekey=keyFactory.generateSecret(desKey);//Cipher对象实际完成解密操作Ciphercipher=Cipher.getInstance("DES");//用密匙初始化Cipher对象cipher.init(Cipher.DECRYPT_MODE,securekey,random);//真正开始解密操作returncipher.doFinal(src);}publicstaticvoidwriteMethod1(byte[]result)
{
StringfileName="C:\\Users\\LZ\\Desktop\\auth3.bin";
try
{
//将DataOutputStream与FileOutputStream连接可输出不同类型的数据
//FileOutputStream类的构造函数负责打开文件kuka.dat,如果文件不存在,
//则创建一个新的文件,如果文件已存在则用新创建的文件代替。然后FileOutputStream
//类的对象与一个DataOutputStream对象连接,DataOutputStream类具有写
//各种数据类型的方法。
DataOutputStreamout=newDataOutputStream(newFileOutputStream(fileName));
out.write(result);
out.close();
}catch(Exceptione)
{
e.printStackTrace();
}
}
publicstaticvoidprintHexString(byte[]b){
for(inti=0;i<b.length;i++)
{
Stringhex=Integer.toHexString(b[i]&0xFF);
if(hex.length()==1){
hex='0'+hex;
}
System.out.print(hex.toUpperCase());
}
System.out.println("");}publicstaticvoidprintHextoChars(byte[]b){
for(inti=0;i<b.length;i++)
{
Stringhex=Integer.toHexString(b[i]&0xFF);
if(hex.length()==1){
hex='0'+hex;
}
System.out.print((char)b[i]);
}
}publicstaticbyte[]toByteArray(Stringfilename)throwsIOException{
Filef=newFile(filename);
if(!f.exists()){
thrownewFileNotFoundException(filename);
}
ByteArrayOutputStreambos=newByteArrayOutputStream((int)f.length());
BufferedInputStreamin=null;
try{
in=newBufferedInputStream(newFileInputStream(f));
intbuf_size=1024;
byte[]buffer=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人教版小学一年级语文下册第2课《姓氏歌》学习指导+课堂笔记+知识点归纳
- 教育机构网络教育平台建设指南
- 2025年黑龙江省佳木斯市东风区事业单位考试题及答案解析
- 2026贵州省旅游产业发展集团有限公司招聘3人备考题库附答案详解【培优】
- 2026四川宜宾江安县人力资源和社会保障局第一次招聘编外聘用人员14人备考题库含答案详解(b卷)
- 2026四川高能智盾科技有限公司招聘系统工程师(系统集成方案解决岗)等岗位70人备考题库【模拟题】附答案详解
- 清洁能源技术发展支持承诺函4篇
- 2026浙江宁波能源集团股份有限公司第一批招聘20人备考题库及参考答案详解【综合题】
- 中国市政中南院2026届春季校园招聘备考题库附完整答案详解【易错题】
- 可持续农业目标责任承诺书范文6篇
- 2026江苏苏州市昆山市自然资源和规划局招聘编外人员8人笔试参考题库及答案解析
- 2026年及未来5年市场数据中国演出行业市场发展数据监测及投资潜力预测报告
- (新教材)2026年部编人教版二年级下册语文 第7课 我不是最弱小的 课件
- 2026年学士学位英语测试题及答案
- 条形、柱下独立基础开挖方案
- 无跨越架封网装置计算程序(直接求解)
- 动物微生物细菌病的实验室诊断方法培训课件
- 装卸搬运作业安全风险告知卡
- 施工晴雨表1(最终版)
- 职业卫生常用警示告示标识
- 口服液灌封机毕业论文-1
评论
0/150
提交评论