首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • [幽默机智问答] 汇编系列,给初学者 [已结贴,结贴人:minl]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • minl
    • 等级:
    发表于:2008-04-23 21:02:34 楼主
    所有答案以后揭晓

    1.  老比尔的病毒
    微软总裁比尔盖茨一生致力于linux病毒的开发,现在病毒已经接近完成了,却发生了个困难。还需要eax中放一个常量-4,但是整个程序只剩下两个字节可用。不过这难不倒比尔,他是如何实现的。(已知所有通用寄存器中都为0)

    2.  微软的全面攻击
    微软一边开始指控一批linux 用户偷取了他们的代码,同时一边带来了一些程序进入linux市场。在这双重打击下,开源程序员们日子每况愈下。你怀疑微软使用了你写的汇编压缩代码。你现在为了生存必须更新原来的代码。为了使微软程序无法使用你的更新,你在程序中要有一段显示个标志,一开始你想显示"(",不过经过测试后发现"("并不好,显示"1"更好。
    要求修改你的程序中的一个字节达到以上目的,如何修改?程序片段如下
    Assembly code
    call label push -1014969024 label: lea ebp,[$ + 8] call ebp sub ebx,ebx inc ebx pop ecx mov edx,ebx mov eax,edx inc eax inc eax sub ebp,byte 12 pop esi call ebp

    待续
    88  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • minl
    • 等级:
    发表于:2008-04-23 21:11:351楼 得分:0
    第二题中要显示的是数字“1” 不是字母“L”
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-23 21:24:402楼 得分:3
    看看先。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-23 21:36:193楼 得分:3
    第一俺瞎猜一下,会不会是DB了两个数值,这个两个数值与系统的的其他东西组成一指令。

    第二个俺还没想,争取在写完最近的一个大工程后,学学逆向工程。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    发表于:2008-04-23 22:21:394楼 得分:20
    有点意思。
    1、想出来了
    push eax
    xchg esp, eax
    2、还没看
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-23 22:24:285楼 得分:3
    佩服佩服。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • minl
    • 等级:
    发表于:2008-04-23 22:39:216楼 得分:0
    问题3  双向链表难题

    某文件系统使用单向链表存文件内容,其文件块结构格式如下一共8字节
    4字节地址,用于指向下个文件地址(如最后一个文件则为0)
    4字节地址,用于指向本身文件地址 (除0之外任何数)

    已知处理这种系统的某个函数getnextfile如下

    ;寄存器edi存有本身文件结构地址
    getnextfile:
                    mov eax, [edi]
                    ret

    现在需要更新此文件系统结构使他可以使用双向列表,不过为了更原来的兼容,其文件块结构格式仍然只能是
    8字节,问如何修改?并且如何写getnextfile此函数可以eax得到下个文件结构格式地址

    ; 已知寄存器edi 存有本身文件结构地址,esi存有上个文件结构地址(如果是本节点为起始节点则为0)
    ; 输出eax为下个文件地址
    getnextfile:
                    .....
                    ret

    要求函数只能最多有2条指令(除ret外),且esi edi不能改变


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • minl
    • 等级:
    发表于:2008-04-23 22:40:147楼 得分:0
    问题3  双向链表难题

    某文件系统使用单向链表存文件内容,其文件块结构格式如下一共8字节
    4字节地址,用于指向下个文件地址(如最后一个文件则为0)
    4字节地址,用于指向本身文件地址 (除0之外任何数)

    已知处理这种系统的某个函数getnextfile如下

    ;寄存器edi存有本身文件结构地址
    getnextfile:
                    mov eax, [edi]
                    ret

    现在需要更新此文件系统结构使他可以使用双向列表,不过为了更原来的兼容,其文件块结构格式仍然只能是
    8字节,问如何修改?并且如何写getnextfile此函数可以eax得到下个文件结构格式地址

    ; 已知寄存器edi 存有本身文件结构地址,esi存有上个文件结构地址(如果是本节点为起始节点则为0)
    ; 输出eax为下个文件地址
    getnextfile:
                    .....
                    ret

    要求函数只能最多有2条指令(除ret外),且esi edi不能改变


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • minl
    • 等级:
    发表于:2008-04-23 22:41:018楼 得分:0
    问题3  双向链表难题

    某文件系统使用单向链表存文件内容,其文件块结构格式如下一共8字节
    4字节地址,用于指向下个文件地址(如最后一个文件则为0)
    4字节地址,用于指向本身文件地址 (除0之外任何数)

    已知处理这种系统的某个函数getnextfile如下

    ;寄存器edi存有本身文件结构地址
    getnextfile:
                    mov eax, [edi]
                    ret

    现在需要更新此文件系统结构使他可以使用双向列表,不过为了更原来的兼容,其文件块结构格式仍然只能是
    8字节,问如何修改?并且如何写getnextfile此函数可以eax得到下个文件结构格式地址

    ; 已知寄存器edi 存有本身文件结构地址,esi存有上个文件结构地址(如果是本节点为起始节点则为0)
    ; 输出eax为下个文件地址
    getnextfile:
                    .....
                    ret

    要求函数只能最多有2条指令(除ret外),且esi edi不能改变


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • minl
    • 等级:
    发表于:2008-04-23 22:42:089楼 得分:0
    问题3  双向链表难题

    某文件系统使用单向链表存文件内容,其文件块结构格式如下一共8字节
    4字节地址,用于指向下个文件地址(如最后一个文件则为0)
    4字节地址,用于指向本身文件地址 (除0之外任何数)

    已知处理这种系统的某个函数getnextfile如下

    ;寄存器edi存有本身文件结构地址
    getnextfile:
                    mov eax, [edi]
                    ret

    现在需要更新此文件系统结构使他可以使用双向列表,不过为了更原来的兼容,其文件块结构格式仍然只能是
    8字节,问如何修改?并且如何写getnextfile此函数可以eax得到下个文件结构格式地址

    ; 已知寄存器edi 存有本身文件结构地址,esi存有上个文件结构地址(如果是本节点为起始节点则为0)
    ; 输出eax为下个文件地址
    getnextfile:
                    .....
                    ret

    要求函数只能最多有2条指令(除ret外),且esi edi不能改变


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • minl
    • 等级:
    发表于:2008-04-23 22:43:1410楼 得分:0
    问题3  双向链表难题

    某文件系统使用单向链表存文件内容,其文件块结构格式如下一共8字节
    4字节地址,用于指向下个文件地址(如最后一个文件则为0)
    4字节地址,用于指向本身文件地址 (除0之外任何数)

    已知处理这种系统的某个函数getnextfile如下

    ;寄存器edi存有本身文件结构地址
    getnextfile:
                    mov eax, [edi]
                    ret

    现在需要更新此文件系统结构使他可以使用双向列表,不过为了更原来的兼容,其文件块结构格式仍然只能是
    8字节,问如何修改?并且如何写getnextfile此函数可以eax得到下个文件结构格式地址

    ; 已知寄存器edi 存有本身文件结构地址,esi存有上个文件结构地址(如果是本节点为起始节点则为0)
    ; 输出eax为下个文件地址
    getnextfile:
                    .....
                    ret

    要求函数只能最多有2条指令(除ret外),且esi edi不能改变


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-23 22:55:1811楼 得分:3
    学习下。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • minl
    • 等级:
    发表于:2008-04-23 22:59:0512楼 得分:0
    问题3  经典双向链表

    题目较长:
    某文件系统文件结构表使用单向链表结构,如下
    4字节头,指向下个文件结构地址(0表示最后个地址)
    4字节,指向文件说明块地址(不能为0)

    现在需要把此文件结构表升级为双向链表,为了兼容原来的程序,不能改变其结构大小,仍然只能是8字节
    问如何修改文件结构表?再写个函数使得符合如下功能。

    ; getlastfile 函数,输入edi,esi分别表示
    ;              edi --> 当前文件结构地址
    ;              esi --> 指向下个文件地址(已经是最后个文件的话则为0)
    ;            输出 eax 为上个文件地址
    getlastfile: 
                  ....
                  ....
                  ret
    函数要求只能最多2条指令,且edi esi不能改变 (eax初始值不定)

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • minl
    • 等级:
    发表于:2008-04-23 23:00:5213楼 得分:0
    第三题中最多两个指令其中不包括ret
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-23 23:02:1514楼 得分:3
    cnzdgs
    回贴亦是善举
    等级:
    发表于:2008-04-23 22:21:394楼 得分:0
    有点意思。
    1、想出来了
    push eax
    xchg esp, eax
    2、还没看

    ---------------

    高,实在是高,佩服,佩服^_^

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • minl
    • 等级:
    发表于:2008-04-23 23:06:0115楼 得分:0
    第一题增加点难度 如果esp 不是0 如何实现呢?(老比尔并不是那么实现的)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    发表于:2008-04-23 23:06:3716楼 得分:10
    2、这个要单步调试,手头没有好的调试工具,不答了。
    3、文件说明块地址最前面4字节储存上个文件地址
    mov eax, [esi]
    mov eax, [eax]
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • minl
    • 等级:
    发表于:2008-04-23 23:19:3617楼 得分:0
    引用 16 楼 cnzdgs 的回复:
    2、这个要单步调试,手头没有好的调试工具,不答了。
    3、文件说明块地址最前面4字节储存上个文件地址
    mov eax, [esi]
    mov eax, [eax]


    文件说明块不能改变阿,改变了还怎么兼容原来的程序呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-24 01:20:2318楼 得分:3
    一群牛人啊~~~学习....
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-24 09:31:2119楼 得分:3
    第3题

    mov esi, [esi+4]
    mov edi, [edi+4]

    等达人指点。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-24 10:06:1920楼 得分:3
    引用 12 楼 minl 的回复:
    问题3  经典双向链表

    题目较长:
    某文件系统文件结构表使用单向链表结构,如下
    4字节头,指向下个文件结构地址(0表示最后个地址)
    4字节,指向文件说明块地址(不能为0)

    现在需要把此文件结构表升级为双向链表,为了兼容原来的程序,不能改变其结构大小,仍然只能是8字节
    问如何修改文件结构表?再写个函数使得符合如下功能。

    ; getlastfile 函数,输入edi,esi分别表示
    ;              edi --> 当前文件结构地址
    ;              esi --> 指向下个文件地址(已经是最后个文件的话则为0)
    ;            输出 eax 为上个文件地址
    getlastfile: 
                  ....
                  ....
                  ret
    函数要求只能最多2条指令,且edi esi不能改变 (eax初始值不定)
    文件说明块中的起始4个字节用来存储上个文件的地址(如果是起始文件,则为0),而原来的4字节头不变,仍然指向下个文件。
    getlastfile:  MOV EAX, [EDI+4]  ;取得文件说明块中的起始4个字节
                  MOV EAX, [EAX]    ;取得上个文件地址
                  ret
    如果CPU不支持第二行的写法,那么就找一个支持这种写法的寄存器替换掉第一行中的目的操作数以及第二行中的源操作数。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • minl
    • 等级:
    发表于:2008-04-24 16:18:4921楼 得分:0
    引用 20 楼 eduhf_123 的回复:
    文件说明块中的起始4个字节用来存储上个文件的地址(如果是起始文件,则为0),而原来的4字节头不变,仍然指向下个文件。


    不正确,文件说明块可以不修改
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-24 16:30:5422楼 得分:3
    引用 21 楼 minl 的回复:
    引用 20 楼 eduhf_123 的回复:
    不正确,文件说明块可以不修改
    不好意思,开始没有看到这句话:
    引用 12 楼 minl 的回复:
    现在需要把此文件结构表升级为双向链表,为了兼容原来的程序,不能改变其结构大小,仍然只能是8字节
    问如何修改文件结构表?


    题目要求升级文件结构表并且不能改变其大小:8字节中需要保存前趋节点指针、后续节点指针、文件说明块指针——不会了...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-24 17:29:2823楼 得分:3
    学习一下。。。。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • minl
    • 等级:
    发表于:2008-04-24 17:54:4824楼 得分:0
    引用 4 楼 cnzdgs 的回复:
    有点意思。
    1、想出来了
    push eax
    xchg esp, eax

    四楼 第一题的答案是正确的,过段时间公布第一题另一个答案,可以不用管esp是多少。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-24 19:02:4325楼 得分:3
    呵呵,有意思!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    发表于:2008-04-24 22:33:2426楼 得分:3
    第1题,对Linux不了解,如果是Windows XP系统,执行int 2eh会返回eax为C0000005,Linux系统是不是有某个中断可以返回eax为-4?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    发表于:2008-04-24 22:44:1827楼 得分:3
    第3题,
    引用 17 楼 minl 的回复:
    文件说明块不能改变阿,改变了还怎么兼容原来的程序呢?

    既然说了“问如何修改文件结构表?”,又说“文件说明块不能改变”,意思是要改那8个字节的链表结构是吗?
    如果这样,就用前4个字节表示下一文件地址,后4字节指向一个新的8字节结构,新结构的前4字节表示上一文件地址,后4字节表示文件说明块。
    mov eax, [edi+4]
    mov eax, [eax]
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • minl
    • 等级:
    发表于:2008-04-24 23:15:3128楼 得分:0
    引用 27 楼 cnzdgs 的回复:
    第3题,
    既然说了“问如何修改文件结构表?”,又说“文件说明块不能改变”,意思是要改那8个字节的链表结构是吗?
    如果这样,就用前4个字节表示下一文件地址,后4字节指向一个新的8字节结构,新结构的前4字节表示上一文件地址,后4字节表示文件说明块。


    不动脑筋是不行的,确实答案没有改变文件说明块。
    过段时间公布答案。给大家机会,说了答案就没有思考余地了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    发表于:2008-04-25 10:43:2529楼 得分:3
    第3题的问题描述很难理解,是所有数据都不能改吗?那“问如何修改文件结构表”又是什么意思?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-25 16:43:4530楼 得分:3
    引用 29 楼 cnzdgs 的回复:
    第3题的问题描述很难理解,是所有数据都不能改吗?那“问如何修改文件结构表”又是什么意思?
    题目的要求是修改文件结构表而不能修改文件说明块。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-26 02:21:5731楼 得分:3
    引用 2 楼 jennyvenus 的回复:
    看看先。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • minl
    • 等级:
    发表于:2008-04-26 05:58:0632楼 得分:0
    引用 26 楼 cnzdgs 的回复:
    第1题,对Linux不了解,如果是Windows XP系统,执行int 2eh会返回eax为C0000005,Linux系统是不是有某个中断可以返回eax为-4?


    不错,很接近正确答案, 公布第一题答案,就是 int byte 80h ,linux 80h系统中断会返回-4
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    发表于:2008-04-26 12:28:0733楼 得分:3
    引用 30 楼 eduhf_123 的回复:
    题目的要求是修改文件结构表而不能修改文件说明块。

    我在27楼的回复就是修改文件结构表啊。
    引用 27 楼 cnzdgs 的回复:
    第3题,
    如果这样,就用前4个字节表示下一文件地址,后4字节指向一个新的8字节结构,新结构的前4字节表示上一文件地址,后4字节表示文件说明块。
    mov eax, [edi+4]
    mov eax, [eax]