问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
安卓学习思路方法总结(七)
移动安全
分享者才是学习中最大的受益者!
前言 -- [安卓学习思路方法总结(一)](https://forum.butian.net/share/321) [安卓学习思路方法总结(二)](https://forum.butian.net/share/332) [安卓学习思路方法总结(三)](https://forum.butian.net/share/505) [安卓学习思路方法总结(四)](https://forum.butian.net/share/510) [安卓学习思路方法总结(五)](https://forum.butian.net/share/511) [安卓学习思路方法总结(六)](https://forum.butian.net/share/662) 这是系列文章的第七篇 我们继续 我们继续 ARM指令集 ------   条件码表 ----  三级流水线 -----  环境搭建 ---- ### 连接真机  上传IDA中的android\_server 我之前上传过了 就不上传了  ### 切换root权限  ### 运行程序   ### 端口转发 ```php adb forward tcp:23946 tcp:23946 ```  安装APK到安卓机上 这次使用的是install 之前安装过了 就不搞了 ```php adb install C:\javandk1.apk ``` ### 打开ddms 挂起程序 ```php adb shell am start -D -n com.example.javandk1/.MainActivity ```  ddms查看 变红色的了  ### IDA Debugger连接    搜索我们的android程序 双击进入即可  熟悉的页面 就来了  ### 增加设置   **F9运行一下** ### 动态调试 ```php jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8600 ```   ### 加载so库  然后运行一下 重新搜索 出现so库  双击进入 即可 继续搜索  IDA窗口了解 -------  ### 寄存器窗口  ### 栈顶  ### 栈底  ### hex 一个字节八位,四个字节是32位 一个十六进制数表示四位,两个十六进制数表示一个字节 这里的数据都是三十二位的,三十二位系统意思是可以处理2的32次方就是4G内存!  ### 关闭的窗口 在这里打开  ndk动态调试实操 --------- ### 下断点 下断点  Yes即可 PC就是往下走 分析每一条指令 ### 第一条指令解析 第一条指令是LDR指令 R0:F54BC000,R3:00000001   小箭头进来   ESC返回  F7单步步入 ### 第二条指令解析 R2的值变成 `00000004` 进行了覆盖写入  F7单步步入 ### 第三条指令解析  STR是栈顶指针 将寄存器的数据存储到存储器 SP 的值是`FFEE2B60`  点击箭头进来  内存里从右往左读就是小端,左往右读就是大端 小端存放 在前面 可以看到var\_4 是被定义的`-4`的意思  是把LR的值给SP 继续单步步入  之前的栈顶是`FFEE2B60` 现在的栈顶是`FFEE2B5C` 60是十六进制的计算=6×16+0=96 然后在通过var\_4就是-4=92 然后92在/16=5余12 商为5对应十六进制5 余数12对应十六进制C 所以这里就是`FFEE2B60`转换为`FFEE2B5C` 查看hex dump   从右往左存储 ### 第四条指令解析 可看到第四条指令中,SP的值是`FFEE2B5C`,EC指向栈顶值`F5240BA9`  SUB 是减 SP减去0C,C是12 SP=5C=5×16+12-12=48/16=5余0->50 继续F7步入 栈顶 就变成了50  ### 第五条指令解析 R1:`00000000` SP:`FFEE2B50` R2:`00000004` ADD是加的意思 R1=SP+R2=5×16+0+0×16+4=84/16=5余4->54  继续步入 可以看到R1变成34(FFEE2B54)  ### 第六条指令解析 R3:`F5433D20` LDR 把右边中括号里面的值,放到R3中 中括号里面的值=R3+0×18=2×16+0+18=50/16=3余2->32  小箭头查看  20的值是:`F50F0111` 一样还是倒着看两位 没有就补0 继续步入  ### 第七条指令解析 R2:`00000004` MOVT指令 这里的T是高16位,进行进1  单步F7步入查看  ### 第八条指令解析 R3:`F50F0111` BLX,B是跳转,L是link链接,Ⅹ是状态 ```php BLX:LR和T,PC会变 BL:LR和PC会变 BX:T和PC会变 ``` 理解一下:就是带链接又带状态的跳转!带链接就是会返回! 会跳到下一条指令的地址:F42B4058  F7单步步入观察T标志位: 请注意:这里我卡死了 重启了一下IDA 所以栈地址发生了改变。。  点击小箭头进来   ESC返回 往下看 最后 它是走到了这里  F4 选中  F7 单步步入 进行返回  成功返回 注:要想跳转分析指令 只需要重新在此处下断点,然后F9进去即可 静态so库分析 ------- 直接把so文件拖入IDA即可   ### Test2分析  注:流程图和文本图 空格切换  #### 第一条指令解析  就是将\[括号内的RO的值取出放入R12中 #### 第二条指令解析  将R3~R5,LR入栈,满递减堆栈 满减递归 STMFD这个放在后面还会详解 #### 第三、四条指令解析  MOV把R0的值给R4 然后直接把`(aAge-0×1288)`的偏移值给R2 双击`aAge`进来   这里自定义的成员变量 aAge表示这个`00002C34`地址 就是`00002C34`这个地址-0x1288数据产生的偏移值 然后把这个偏移值放入R2 ESC 返回 #### 第五、六条指令解析  和上面很像 MOV把R1的值给R5 然后直接把`(aLjavaLangStrin - 0×128C`的偏移值给R3 双击`aLjavaLangStrin`进来  aLjavaLangStrin表示这个`00002C20`地址 就是`00002C20`这个地址·-0×128C·数据产生的偏移值 然后把这个偏移值放入R3 ESC 返回 #### 第七、八条指令解析  ADD加,PC当前要执行的地址 +R2里面的值 的和 放入R2 这时候地址里面的数据就是`age` PC当前要执行的地址 +R2里面的值 的和 放入R3 这时候地址里面的数据就是`Ljava/lang/String` 注:后面动态调试 还会继续说明 #### 第九~十五指令解析  ```php 1、BLX执行后,R2存放的地址是下一跳的地址值,0000128C,这里T:0->1 2、R4的值取出放入R3 3、MOV把R5的值给R1赋值 4、把[R3,#0×24]地址里面的数据放入R3寄存器 5、MOV把R0的值给R2赋值 6、一样是BLX 7、MOV把R0的值给R4赋值 ``` #### 第十六~十八指令解析  ```php 1、BL:不带状态 只有B带上X才表示即将执行的指令会发生一个指令集的变化即ARM变成tumb或者是thumb变成ARM 那么这里只是BL不带X,所以T是不会变动的,就是单纯的把地址放入LR 2、MOV把R0的值给R2赋值 3、LDMED和 STMFD是对应存在的,会在后面的动态调试进行解释 ``` OK 这次就到这里
发表于 2021-10-12 12:09:27
阅读 ( 5495 )
分类:
漏洞分析
1 推荐
收藏
0 条评论
请先
登录
后评论
略略略
36 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!