鱼C论坛

 找回密码
 立即注册
查看: 4884|回复: 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
小甲鱼最新课程 -> https://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后面的地址算出来的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  1. [bits 32]
  2. start:
  3. L1:        nop
  4.         call        L1
  5.         nop
  6. L2:        call        L2
  7.         nop
  8.         call        L3
  9. L3:        nop
复制代码

  1. > nasm -o main.bin main.asm

  2. > ndisasm -b 32 main.bin
  3. 00000000  90                nop
  4. 00000001  E8FAFFFFFF        call 0x0
  5. 00000006  90                nop
  6. 00000007  E8FBFFFFFF        call 0x7
  7. 0000000C  90                nop
  8. 0000000D  E800000000        call 0x12
  9. 00000012  90                nop

  10. >
复制代码

小甲鱼最新课程 -> https://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,,,抱歉,我看不出其中的规律
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://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的呢
抱歉给您添麻烦了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

也就是0xfffffffa

换一个
1254BC71

12 54 bc 71
0x71bc5412
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

"发现对于call上一条,偏移是-6"
这取决于上一条指令的长度,不是偏移永远都是-6
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

嗯 以指令的开头算起对吧 FF(两个字母)为一个字节
非常感谢您的回答,占用您的时间了!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

对于向前转移也一样
  1.   445f0c:       90                      nop
  2.   445f0d:       90                      nop
  3.   445f0e:       90                      nop
  4.   445f0f:       90                      nop
  5.   
  6.   
  7.   445f10:       db e3                   fninit
  8.   
  9.   
  10.   445f12:       c3                      retq
  11.   445f13:       90                      nop
  12.   445f14:       90                      nop
  13.   445f15:       90                      nop
  14.   445f16:       90                      nop
  15.   445f17:       90                      nop
  16.   ...
  17.   446840:       ba 01 00 00 00          movl   $0x1,%edx
  18.   446845:       b9 0b 00 00 00          movl   $0xb,%ecx
  19.   44684a:       e8 41 0d 00 00          callq  0x447590
  20.   44684f:       b8 ff ff ff ff          movl   $0xffffffff,%eax
  21.   446854:       e9 c4 fe ff ff          jmpq   0x44671d
  22.   446859:       ba 01 00 00 00          movl   $0x1,%edx
  23.   44685e:       b9 08 00 00 00          movl   $0x8,%ecx
  24.   446863:       e8 28 0d 00 00          callq  0x447590
  25.   
  26.   
  27.   446868:       e8 a3 f6 ff ff          callq  0x445f10
  28.   
  29.   
  30.   44686d:       e9 38 ff ff ff          jmpq   0x4467aa
  31.   446872:       90                      nop
  32.   446873:       90                      nop
  33.   446874:       90                      nop
  34.   446875:       90                      nop
复制代码



445f10 - 44686d = fffff6a3
e8 a3 f6 ff ff
小甲鱼最新课程 -> https://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这种?)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

先得到 6 的二进制形式

00000000000000000000000000000110
取反
11111111111111111111111111111001
然后再加 1
11111111111111111111111111111010

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

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这是gnu语法的汇编语言
明白了这个地址的计算方法就行了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

先得到 6 的二进制形式

嗯?-6在内存中不是以FAFFFFFF表示的么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

嗯,谢谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

虽然说在计算器里面的确FFFFFFFA=-6
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

FFFFFFFA

嗯,而且我发现似乎jmp这些也是一样的情况(幸好我暂时不需要改写jmp)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

嗯,jmp也一样
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 15:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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