UPX压缩脱壳「建议收藏」

UPX压缩脱壳「建议收藏」该方法可针对upx变种,但AndroidLinker的时候不需要section表,所以我们不能修复section表进行SO层代码脱壳1.使用IDA打开libexec.so,在导出函数中找到.init_proc函数(0x39A79),搜索特征码7D2700DF搜索到下面语句2.自己编译一个load程序,然后ida附加.刚好到死跳转处,注意…

大家好,又见面了,我是你们的朋友全栈君。

该方法可针对 upx 变种,但Android Linker 的时候不需要section表, 所以我们不能修复 section 表

进行SO层代码脱壳

1. 使用IDA 打开libexec.so,在导出函数中找到.init_proc 函数(0x39A79), 搜索特征码7D 27 00 DF

UPX压缩脱壳「建议收藏」

        搜索到下面语句    

        UPX压缩脱壳「建议收藏」     

        2.自己编译一个load程序 , 然后ida 附加.

        UPX压缩脱壳「建议收藏」

        刚好到 死跳转处, 注意 r0和 r1修复program head 有用

        3.开始dump 数据, 

UPX压缩脱壳「建议收藏」

从基地址开始0x40501000  到0x40559000 结束, 也就是刚才下面一个libexec  的segment结束.

      4.修复program head

UPX压缩脱壳「建议收藏」

 

这里是p_files和p_memsz 是错误的需要修正,  这里大小的计算为

mprotect 函数的参数1 + 参数2 – 模块基地址 结果如下:

0x40511000 + 0x00047490 – 0x40501000 = 0x57490;

    并修改第一个(RW_) Loadable Segment的文件偏移,P_offet = p_addr – 0x1000 , 这里 应该修改为 0x57EE0; 下面是修改后的

UPX压缩脱壳「建议收藏」

        5.修补数据

打开原始文件 libexec.so 文件定位到

第一个 (RW_) Loadable Segment的p_offset文件偏移0x3AEE0 , p_memsz 大小 (0x4BC8),  这里我们将这一步份数据复制出来, 粘贴到我dump出来的偏移 0x57EE0 处

UPX压缩脱壳「建议收藏」

         6. 获得原始init 函数 RVA

        定位原始的init 函数地址, 我们返回到刚才调试的IDA 中

UPX压缩脱壳「建议收藏」

 0x404E8649就VA了这里我们减掉基地址 0x404D6000 获得RVA为 0x12649, 也可以将上面的死条状指令恢复然后, 一直 F8 经2次返回就可到原始 init 函数

        第一次返回:

UPX压缩脱壳「建议收藏」

         第二次返回:

UPX压缩脱壳「建议收藏」

 

 

7.修改 .init_prot 偏移地址

.init_prot  rva= 0x039A79 , 所以我们在刚粘贴的数据中用WinHex 搜索 16进制

 0C 00 00 00 79 9A 03 00   //前4个字节是类型标识 后4个字节是函数偏移地址

UPX压缩脱壳「建议收藏」

我们要将这里的 0x39A79 壳代码修改为原始的init函数.最终修改为

UPX压缩脱壳「建议收藏」

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/159882.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号