鱼C论坛

 找回密码
 立即注册
查看: 4077|回复: 20

[已解决]Call和十六进制的转换的一些问题

[复制链接]
发表于 2020-2-7 16:15:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
各位大佬好,我想问一下
最佳答案
2020-2-7 22:20:46
FAFFFFFF是在内存中的表示形式,看的时候,从右往左看,两个字母为1组
fa ff ff ff

也就是0xfffffffa

换一个
1254BC71

12 54 bc 71
0x71bc5412
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-7 16:18:37 | 显示全部楼层
(怎么直接发出去了)
  E8 F9FFFFFF       call ws2_32.764B6CFF               
  E8 00000001     call 774B6D0B
  E8 00000000     call ws2_32.764B6D10
这个 E8 后面的十六进制是怎么通过call后面的地址算出来的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-7 19:23:07 | 显示全部楼层
请先自己通过这个程序理解,然后把你不懂的地方指出来
[bits 32]
start:
L1:        nop
        call        L1
        nop
L2:        call        L2
        nop
        call        L3
L3:        nop
> nasm -o main.bin main.asm

> ndisasm -b 32 main.bin
00000000  90                nop
00000001  E8FAFFFFFF        call 0x0
00000006  90                nop
00000007  E8FBFFFFFF        call 0x7
0000000C  90                nop
0000000D  E800000000        call 0x12
00000012  90                nop

> 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-2-7 21:44:03 | 显示全部楼层
人造人 发表于 2020-2-7 19:23
请先自己通过这个程序理解,然后把你不懂的地方指出来

万分感谢您在百忙之中抽空回答我的问题,只是。。。
我没学汇编啊
虽说我也知道不会却直接往汇编区发帖有问题。。

按照我的理解的话,看起来是
(在除了call全是nop的前提下)
call下一行则为E8 00000000,
call本行则是   E8 FBFFFFFF,
call上一行则是E8 FAFFFFFF。
我再用OD试了一下,
call上两行则是E8 F9FFFFFF
call上三行则是E8 F8FFFFFF
然后总是F后面这个数字在不断消减,随后减少的是第一个字母。。。。
然后到了第四位。。。。emmm,,,抱歉,我看不出其中的规律
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-7 21:51:29 | 显示全部楼层
Lpyax 发表于 2020-2-7 21:44
万分感谢您在百忙之中抽空回答我的问题,只是。。。
我没学汇编啊
虽说我也知道不会却直接往 ...

e8后面的4个字节表示从call指令的下一条指令开始的偏移
第3个call的是call指令的下一条指令,使用偏移就是0

call指令一共5个字节,所以call当前的这条call指令的偏移就是 0 - 5 = -5,fffffffb就是-5
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-2-7 22:00:07 | 显示全部楼层
人造人 发表于 2020-2-7 21:51
e8后面的4个字节表示从call指令的下一条指令开始的偏移
第3个call的是call指令的下一条指令,使用偏移就 ...

喔!而nop占一个字节,所以call上一行的nop就是偏移-6,也就是FFFFFFFA。
可是,FFFFFFFA和FFFFFFFB又是怎么变成FAFFFFFF和FBFFFFFF的呢

我百度看到的是取反码然后按位+1,不过这样不也就是得了个6(十六进制)而已么。。不是很明白。。
上述引用资料:https://zhidao.baidu.com/question/579612385.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-7 22:06:39 | 显示全部楼层
人造人 发表于 2020-2-7 21:51
e8后面的4个字节表示从call指令的下一条指令开始的偏移
第3个call的是call指令的下一条指令,使用偏移就 ...

(刚刚回复了一次不过好像要审核,应该是加了个网址)
按照您所说的我又去试了一下,发现对于call上一条,偏移是-6,也就是FFFFFFFA
但是我又有一个问题,FFFFFFFA和FFFFFFFB又是怎么转换成FAFFFFFF和FBFFFFFF的呢
抱歉给您添麻烦了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-7 22:20:46 | 显示全部楼层    本楼为最佳答案   
FAFFFFFF是在内存中的表示形式,看的时候,从右往左看,两个字母为1组
fa ff ff ff

也就是0xfffffffa

换一个
1254BC71

12 54 bc 71
0x71bc5412
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-7 22:22:56 | 显示全部楼层
Lpyax 发表于 2020-2-7 22:06
(刚刚回复了一次不过好像要审核,应该是加了个网址)
按照您所说的我又去试了一下,发现对于call上一条 ...

"发现对于call上一条,偏移是-6"
这取决于上一条指令的长度,不是偏移永远都是-6
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-7 22:25:32 | 显示全部楼层
人造人 发表于 2020-2-7 22:22
"发现对于call上一条,偏移是-6"
这取决于上一条指令的长度,不是偏移永远都是-6

嗯 以指令的开头算起对吧 FF(两个字母)为一个字节
非常感谢您的回答,占用您的时间了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-7 22:41:04 | 显示全部楼层
  401067:       85 c0                   testl  %eax,%eax
  401069:       74 57                   je     0x4010c2
  40106b:       b9 02 00 00 00          movl   $0x2,%ecx
  
  
  401070:       e8 db 66 04 00          callq  0x447750
  
  
  401075:       48 c7 c1 ff ff ff ff    movq   $0xffffffffffffffff,%rcx
  40107c:       e8 af 4e 04 00          callq  0x445f30
  401081:       48 8b 15 58 20 12 00    movq   0x122058(%rip),%rdx        # 0x5230e0
  401088:       48 89 02                movq   %rax,(%rdx)
  40108b:       48 8b 15 3e 20 12 00    movq   0x12203e(%rip),%rdx        # 0x5230d0
  401092:       48 89 02                movq   %rax,(%rdx)
  401095:       48 8b 05 a4 20 12 00    movq   0x1220a4(%rip),%rax        # 0x523140
  40109c:       8b 10                   movl   (%rax),%edx
  40109e:       48 8b 05 db 1f 12 00    movq   0x121fdb(%rip),%rax        # 0x523080
  4010a5:       48 8b 00                movq   (%rax),%rax
  4010a8:       89 10                   movl   %edx,(%rax)
  4010aa:       e8 71 4a 04 00          callq  0x445b20
  4010af:       48 8b 05 3a 1f 12 00    movq   0x121f3a(%rip),%rax        # 0x522ff0
  4010b6:       83 38 01                cmpl   $0x1,(%rax)
  4010b9:       74 65                   je     0x401120
  4010bb:       31 c0                   xorl   %eax,%eax
  4010bd:       48 83 c4 28             addq   $0x28,%rsp
  4010c1:       c3                      retq
  ...
  447748:       ff 25 be 4d 0f 00       jmpq   *0xf4dbe(%rip)        # 0x53c50c
  44774e:       90                      nop
  44774f:       90                      nop
  
  
  447750:       ff 25 ae 4d 0f 00       jmpq   *0xf4dae(%rip)        # 0x53c504
  
  
  447756:       90                      nop
  447757:       90                      nop
  447758:       ff 25 96 4d 0f 00       jmpq   *0xf4d96(%rip)        # 0x53c4f4
  44775e:       90                      nop
  44775f:       90                      nop


这个偏移的计算方法是,目标地址 - 当前指令的下一条指令的地址
  401070:       e8 db 66 04 00          callq  0x447750
  447750:       ff 25 ae 4d 0f 00       jmpq   *0xf4dae(%rip)        # 0x53c504

也就是 447750 - 401075 = 000466db

db 66 04 00 就是 000466db

对于向前转移也一样
  445f0c:       90                      nop
  445f0d:       90                      nop
  445f0e:       90                      nop
  445f0f:       90                      nop
  
  
  445f10:       db e3                   fninit
  
  
  445f12:       c3                      retq
  445f13:       90                      nop
  445f14:       90                      nop
  445f15:       90                      nop
  445f16:       90                      nop
  445f17:       90                      nop
  ...
  446840:       ba 01 00 00 00          movl   $0x1,%edx
  446845:       b9 0b 00 00 00          movl   $0xb,%ecx
  44684a:       e8 41 0d 00 00          callq  0x447590
  44684f:       b8 ff ff ff ff          movl   $0xffffffff,%eax
  446854:       e9 c4 fe ff ff          jmpq   0x44671d
  446859:       ba 01 00 00 00          movl   $0x1,%edx
  44685e:       b9 08 00 00 00          movl   $0x8,%ecx
  446863:       e8 28 0d 00 00          callq  0x447590
  
  
  446868:       e8 a3 f6 ff ff          callq  0x445f10
  
  
  44686d:       e9 38 ff ff ff          jmpq   0x4467aa
  446872:       90                      nop
  446873:       90                      nop
  446874:       90                      nop
  446875:       90                      nop


445f10 - 44686d = fffff6a3
e8 a3 f6 ff ff
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-7 22:47:03 | 显示全部楼层
人造人 发表于 2020-2-7 22:41
这个偏移的计算方法是,目标地址 - 当前指令的下一条指令的地址
  401070:       e8 db 66 04 00    ...

喔!明白了,学习到了(虽说这些代码看不懂...为啥mov后面加个l,call和jmp后面加个q。。。是缩写么 jmp far这种?)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-7 22:47:07 | 显示全部楼层
要得到 -6 在内存中的存储格式

先得到 6 的二进制形式

00000000000000000000000000000110
取反
11111111111111111111111111111001
然后再加 1
11111111111111111111111111111010

这就是 -6
换回十六进制就是
FFFFFFFA

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-7 22:48:42 | 显示全部楼层
Lpyax 发表于 2020-2-7 22:47
喔!明白了,学习到了(虽说这些代码看不懂...为啥mov后面加个l,call和jmp后面加个q。。。是 ...

这是gnu语法的汇编语言
明白了这个地址的计算方法就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-7 22:52:28 | 显示全部楼层
人造人 发表于 2020-2-7 22:47
要得到 -6 在内存中的存储格式

先得到 6 的二进制形式

嗯?-6在内存中不是以FAFFFFFF表示的么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-7 22:53:04 | 显示全部楼层
人造人 发表于 2020-2-7 22:48
这是gnu语法的汇编语言
明白了这个地址的计算方法就行了

嗯,谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-7 22:53:40 | 显示全部楼层
Lpyax 发表于 2020-2-7 22:52
嗯?-6在内存中不是以FAFFFFFF表示的么

虽然说在计算器里面的确FFFFFFFA=-6
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-7 22:56:07 | 显示全部楼层
Lpyax 发表于 2020-2-7 22:52
嗯?-6在内存中不是以FAFFFFFF表示的么

那就两个一组,再倒过来

FFFFFFFA

ff ff ff fa

fa ff ff ff
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-7 23:00:35 | 显示全部楼层
人造人 发表于 2020-2-7 22:56
那就两个一组,再倒过来

FFFFFFFA

嗯,而且我发现似乎jmp这些也是一样的情况(幸好我暂时不需要改写jmp)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-7 23:01:30 | 显示全部楼层
Lpyax 发表于 2020-2-7 23:00
嗯,而且我发现似乎jmp这些也是一样的情况(幸好我暂时不需要改写jmp)

嗯,jmp也一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-5 18:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表