首页
社区
课程
招聘
[原创]thumb2 BL / BLX指令机器码计算
发表于: 2015-4-9 14:08 20212

[原创]thumb2 BL / BLX指令机器码计算

2015-4-9 14:08
20212
向后跳转

0012 00F001F8              bl .Lhelo

           .Lhelo:
0018 05F0D1F7              pld [r1, r5]

计算方式:

取高位 f000, 取后11位 => 000
取低位 f801, 取后11位 => 001

计算: (000 << 12) | (001 << 1) = 2

由于这个最高位符号位为0. 代表向后跳转, 只需要保留该值2即可

然后计算得到的目标地址为 : 0x0012 + 4 + 2 = 0x0018

向前跳转

00001164 FF F7 BE FF                             BL      _Z4testv

_Z4testv
000010E4 07 B5                                   PUSH    {R0-R2,LR}

计算方式:

取高位 f7ff, 取后11位 => 7ff
取低位 ffbe, 取后11位 => 7be

计算: (7ff << 12) | (7be << 1) = 7fff7c

由于这个最高位符号位为1 代表向前跳转, 需要-1然后取反 得到值为 ff800084。取84即可

然后计算得到的目标地址为 : 0x1164 + 4 - 0x84 = 0x10e4

逆向过程:

BL <label>

由BL指令得到机器码算法:

offset = dstAddr - srcAddr;

offset = (offset -4) & 0x007fffff;

high = offset >> 12;
low  = (offset & 0x00000fff) >> 1;

machineCode = ((0xFF00 | low) << 16) | (0xF000 | high);

BLX <label>

与BL类似,只不过计算机器码算法稍有不同

offset = dstAddr - srcAddr;

offset = (offset -4) & 0x007fffff;

high = offset >> 12;
low  = (offset & 0x00000fff) >> 1;

if(low%2 != 0) {
        low++;
}


machineCode = ((0xEF00 | low) << 16) | (0xF000 | high);

[课程]Android-CTF解题方法汇总!

收藏
免费 6
支持
分享
最新回复 (8)
雪    币: 94
活跃值: (2197)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
这个不错,之前也研究过一下这个

BL那个好像是F800才对吧?
2015-4-9 16:37
0
雪    币: 80
活跃值: (92)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
很好的文章,谢谢楼主分享
2015-5-7 12:03
0
雪    币: 47
活跃值: (43)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
请问,楼主,b和bx怎么计算呀
2015-7-28 00:47
0
雪    币: 174
活跃值: (205)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
5
找个白皮书看下opcode encode不就完了
2015-7-28 16:44
0
雪    币: 163
活跃值: (1538)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
这应该一样的吧
2015-7-28 18:19
0
雪    币: 6
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢分享技术文章,前来学习。
2015-7-28 18:56
0
雪    币: 20
活跃值: (190)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
2楼说的对,BL那个是F800才对
2016-2-20 15:17
0
雪    币: 53
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9

可以使用工具直接得到机器码

2023-7-13 10:01
0
游客
登录 | 注册 方可回帖
返回
//