首页
社区
课程
招聘
[分享]动态调试-JEB动态调式破解flag
2022-2-2 15:33 6055

[分享]动态调试-JEB动态调式破解flag

2022-2-2 15:33
6055

0x1 jeb介绍

  1.简介

 

Jeb提供了APK反编译以及smali动态调试的功能,是每一个安卓逆向工程师必须掌握的工具。

 

  2.作用

 

在安卓逆向中,仅通过反编译apk静态分析smali代码存在局限性,通常需要配合jeb动态调试来快速掌握应用程序的执行流程,其次,在程序运行的过程,有些数据是动态生成的,无法通过静态分析来掌握程序的执行流程。

 

  3.步骤

 

1)使用jeb反编译apk得到smali代码

 

2)adb shell am start -D -n包名/.主活动界面 (以debug模式启动进程,启动的时候会暂停,就可以使用jeb附加

 

3)下断点

 

4)jdb -connect(port是ddms里面看到的端口)

 

com.sun.jdi.SocketAttach:hostname=localhost,port= 8700继续执行

0x2 debug模式运行

  1.adb shell,dumpsys activity top,显示顶层窗口

1
2
3
ACTIVITY com.kanxue.kctfso/.MainActivity bed28f5 pid=3633
  Local Activity ee7adf1 State:
    mResumed=true mStopped=false mFinished=false

  2.输入am start -D -n com.kanxue.kctfso/.MainActivity,以debug执行,如图所示,程序运行等待我们附加。。

1
2
3
127|aosp:/ # am start -D -n com.kanxue.kctfso/.MainActivity
Starting: Intent { cmp=com.kanxue.kctfso/.MainActivity }
aosp:/ #

 

  3.打开ddms工具,看到调试端口8612。

 

 

  4.输入jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8612

1
2
3
4
5
6
C:\Users\LENOVO>jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=86
12
设置未捕获的java.lang.Throwable
设置延迟的未捕获的java.lang.Throwable
正在初始化jdb...
>

模拟器里面有continue按钮,点击就可以继续执行,如果没有这个就需要使用jdb命令连接,这是java环境自带的调试工具

0x3 实战破解flag

  1.按照:JEB3.19_Pro的安装和过期这个教程,安装jeb,注意,如果是jeb2.27只支持jdk1.8以下版本。

 

1)解压jeb3.19,双击jeb_wincon.bat,输入密码:ilbtcdnwiuypbzeo

 

2)点击手动生成Key的界面,复制生成的许可证的数据

 

3)点击jebKeygen.exe,输入上面复制号的数据,回车就能获取到密钥

 

4)过期问题解决

 

解压jeb_3_1_9_patch.zip覆盖到jeb安装目录

 

  2.将apk拖进jeb,可以看到MainActivity类,再去模拟器里面运行一下,点击确定,提示很遗憾,闯关失败。

 

 

  3.那么以字符串为突破点,在jeb中Ctrl+F搜索“很遗憾,闯关失败”,勾选环绕搜索:

 

 

  4.向上找到关键跳if-eqz,v1等于0就失败,v1不等于0就成功,上面是v1和v0进行比较。

1
2
3
4
5
6
7
8
0000002A  iget-object         v1, p0, MainActivity$3->val$ET:EditText
0000002E  invoke-virtual      EditText->getText()Editable, v1
00000034  move-result-object  v1
00000036  invoke-virtual      Object->toString()String, v1
0000003C  move-result-object  v1
0000003E  invoke-virtual      String->equals(Object)Z, v1, v0
00000044  move-result         v1
00000046  if-eqz              v1, :6C

  5.v2字符串进行base64加密,然后按UTF-8编码转换成字符串。

1
2
3
4
5
6
7
8
9
10
11
00000000  const/4             v0, 0
:2
00000002  new-instance        v1, String
00000006  const-string        v2, "5Y2K5p2v5YeJ6Iy2"
0000000A  const/4             v3, 2
0000000C  invoke-static       Base64->decode(String, I)[B, v2, v3
00000012  move-result-object  v2
00000014  const-string        v3, "utf-8"
00000018  invoke-direct       String-><init>([B, String)V, v1, v2, v3
:1E
0000001E  move-object         v0, v1

  6.那么我们可以在00000002这里下断点(ctrl+b),点debug-start,然后找到我们这个包名,点附加,然后flag随便输入kanxue,点确定,然后成功断了下来,查看局部变量:

 

 

  7.F6单步向下走,运行到v2处,将v1和v2的类型手动改成string,然后继续走,走到v3的位置时同样将类型手动改成string,然后继续F6单步走,将v1寄存器中“半杯凉茶”给v0,将v0的类型也改成string。

 

继续F6单步走,可以看到寄存器v1的值是我们输入的kanxue,寄存器v0的值是“半杯凉茶”,接下来比较flag和我们输入的是否相等。

 

 

  8.输入flag进行验证:

 


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞2
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回