免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8705 | 回复: 9
打印 上一主题 下一主题

用objdump反汇编内核模块后, 对汇编代码的几个疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-14 14:22 |只看该作者 |倒序浏览
下面是截取得一个函数:
0000001e <gas_netlink_uninit>:
  1e: 53                      push   %ebx
  1f: b9 01 00 00 00          mov    $0x1,%ecx
  24: 83 ec 04                sub    $0x4,%esp
  27: a1 00 00 00 00          mov    0x0,%eax
  2c: ba 0f 00 00 00          mov    $0xf,%edx
  31: 8b 58 04                mov    0x4(%eax),%ebx
  34: 8b 00                   mov    (%eax),%eax
  36: e8 fc ff ff ff          call   37 <gas_netlink_uninit+0x19>
  3b: 8b 43 48                mov    0x48(%ebx),%eax
  3e: ba 03 00 00 00          mov    $0x3,%edx
  43: b9 01 00 00 00          mov    $0x1,%ecx
  48: c7 04 24 00 00 00 00    movl   $0x0,(%esp)
  4f: e8 fc ff ff ff          call   50 <gas_netlink_uninit+0x32>
  54: a1 00 00 00 00          mov    0x0,%eax
  59: 83 c0 6c                add    $0x6c,%eax
  5c: e8 fc ff ff ff          call   5d <gas_netlink_uninit+0x3f>
  61: 8b 83 20 01 00 00       mov    0x120(%ebx),%eax
  67: e8 fc ff ff ff          call   68 <gas_netlink_uninit+0x4a>
  6c: a1 00 00 00 00          mov    0x0,%eax
  71: e8 fc ff ff ff          call   72 <gas_netlink_uninit+0x54>
  76: c7 05 00 00 00 00 00    movl   $0x0,0x0
  7d: 00 00 00
  80: 5a                      pop    %edx
  81: 5b                      pop    %ebx
  82: c3                      ret

问题如下:
1.27: a1 00 00 00 00          mov    0x0,%eax 这一行中, mov 后面的0x0表示的是什么? 如果是立即数应该是$0x0才对
2.36: e8 fc ff ff ff          call   37 <gas_netlink_uninit+0x19>.这里的call后面的37表示的是什么, 在这个代码中没有37这一行,比较疑惑

论坛徽章:
0
2 [报告]
发表于 2008-01-14 15:26 |只看该作者
说错了,0x0就是有效地址0处的值

[ 本帖最后由 flw2 于 2008-1-14 15:37 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-01-14 15:34 |只看该作者
货真价实的linux代码, 这一段是操作linux的内核线程的, 由于有bug
对应的c是
void gas_netlink_uninit(void)
{
    struct sock *sk = ns->sock;

    kill_proc(ns->pid, SIGTERM, 1);

    wake_up(sk->sk_sleep);

    wait_for_completion(&ns->exit);

    sock_release(sk->sk_socket);
    kfree(ns);
    ns = NULL;
}

本意是用来终止一个内核线程, 只是运行过程中有时导致内核崩溃,刚好EIP又指向了这个函数 ,所以我才想看看是那个地方出错了.

论坛徽章:
0
4 [报告]
发表于 2008-01-14 15:35 |只看该作者
你这个是没有重定位的代码
0x0是需要连接时补充的,37那个也一样

论坛徽章:
0
5 [报告]
发表于 2008-01-14 15:39 |只看该作者
那请问如何进行连接定位?我的代码是自己写的一个内核模块

论坛徽章:
0
6 [报告]
发表于 2008-01-14 15:42 |只看该作者
原帖由 yj1804 于 2008-1-14 15:39 发表
那请问如何进行连接定位?我的代码是自己写的一个内核模块

恩,模块,我不懂你的代码是干嘛的,但是你是不是可以别通过试图反汇编来看问题,看看代码本身有什么问题

论坛徽章:
0
7 [报告]
发表于 2008-01-14 15:46 |只看该作者
恩, 问题本身已经通过其他手段解决,
个人比较想学习一下通过汇编寻找问题的方式, 因为有的时候问题非常难重现, 只能从出错的oops开始分析
或者有什么书籍,网站推荐也可以, google找过好几次都没有找到比较好的介绍这方面的信息

[ 本帖最后由 yj1804 于 2008-1-14 15:47 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2008-01-22 23:45 |只看该作者
可以看一下《深入理解计算机系统》链接那一章,这两个问题讲得很清楚

论坛徽章:
0
9 [报告]
发表于 2008-01-23 01:08 |只看该作者
原帖由 yj1804 于 2008-1-14 14:22 发表
下面是截取得一个函数:
1.27: a1 00 00 00 00          mov    0x0,%eax 这一行中, mov 后面的0x0表示的是什么? 如果是立即数应该是$0x0才对
2.36: e8 fc ff ff ff          call   37 <gas_netlink_uninit+0x19>.这里的call后面的37表示的是什么, 在这个代码中没有37这一行,比较疑惑  ...


1、0x0 是个地址值, mov 0x0, %eax 这条语句是指:将地址为 0x0 里的 32 位值送入 %eax

2、call 37 , 在这里 37 是目标 target。37 已经对应这个函数里的某一行,但这个行不是一条正确语句的行
在这里偶稍为的给你讲解一下 x86 的编码知识,若你的基础较差,或许比较难明:
call 37 中的 37 在 gas 汇编语法里是 target 值,
这个 target 值是这样计算出来的:target = eip + offset。
编码:e8 fc ff ff ff 中,e8 是 call 指令的 encode 码,调用目标依赖于当前 eip 值,也就是上面所说 target = eip + offset
fc ff ff ff  4个字节是 offset 值,而 eip 值是下一条语句,即:3b。
所以: 37 = eip + 0xff ff ff fc = 3b + 0xfffffffc = 37

gas 表示出来的形式有点让人述惑,37 让一般看不懂到底是哪里, 到底是哪里呢?
37 就在 e8 fc ff ff ff 这条编码的 fc 处,就是 e8 字节的下1个字节。 显然,这条 call 指令跳转到一个错误的地方,
这是,gas 进行了编译而未进行链接时出现的伪目标地址。很显然:call 要跳转到文件外的另一个函数里。
gas 未链接时是不知道这个函数在哪里的,经过链接后才真正是嵌入真实地址,fc ff ff ff 只是个临时值,真实地址会覆盖掉 fc ff ff ff
这就是链接时重定位的过程

评分

参与人数 1可用积分 +15 收起 理由
albcamus + 15 精品文章

查看全部评分

论坛徽章:
0
10 [报告]
发表于 2008-01-23 13:28 |只看该作者
原帖由 mik 于 2008-1-23 01:08 发表


1、0x0 是个地址值, mov 0x0, %eax 这条语句是指:将地址为 0x0 里的 32 位值送入 %eax

2、call 37 , 在这里 37 是目标 target。37 已经对应这个函数里的某一行,但这个行不是一条正确语句的行
在这里 ...

好,学习了,一直没把x86汇编搞清楚过。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP