LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1362|回复: 13

回 MMMIX , 我的机器码程序写出来了!

[复制链接]
发表于 2007-5-20 17:50:21 | 显示全部楼层 |阅读模式
前几天一直在忙一个网络程序,没时间弄,这几天给弄出来了,
写出来了,
7F 45 4C 46  01 01 01 00  00 00 00 00  00 00 00 00
02 00 03 00  01 00 00 00  84 80 04 08  34 00 00 00
74 00 00 00  00 00 00 00  34 00 20 00  02 00 00 00
00 00 00 00  01 00 00 00  00 00 00 00  00 80 04 08
00 80 04 08  A5 00 00 00  A5 00 00 00  05 00 00 00
00 01 00 00  01 00 00 00  74 00 00 00  74 90 04 08
74 90 04 08  0D 00 00 00  0D 00 00 00  06 00 00 00
00 01 00 00  48 65 6C 6C  6F 20 57 6F  72 6C 64 21
0A 00 00 00  B8 04 00 00  00 BB 01 00  00 00 B9 74
90 04 08 BA  0C 00 00 00  CD 80 B8 01  00 00 00 BB
00 00 00 00  CD 80 00 00

用16进制编辑器,输入,直接运行。
输出Hello World!
虽然没有像windows下的DEBUG那样,但是我相信,
有一天linux下会有和那个一样的工具的。
以后别说我不懂操作系统原理了,太伤自尊了。
我问的问题,你们根本没理解好,还有后一半你们根本
没回答。不过现在我也会了,如何在C中嵌入机器码,
如何从汇编中调用标准C库函数也会了。
发表于 2007-5-20 20:08:06 | 显示全部楼层
这个不能算纯粹的机器码吧。。。
“7F 45 4C 46”是标准的 ELF 文件头(ELF文件——*nix下的一种可执行文件格式,像Windows下的PE,DOS下的MZ那样),这个不是纯粹的机器码,需要系统根据ELF的标准先载人再进行相关系统调用的。
如果随便给你一段二进制代码就可以执行的话那样肯定是不安全的(好像DOS下的COM文件就是这样的)。

如果所料不错的话LZ应该是先研究了用汇编编译出的代码,才得出以上代码的吧?

其实,不一定要用到 16进制编辑器,直接用 shell 命令 echo , printf ,或 perl 'print' 等 就可以输出到二进制文件。
如:
$ echo -e "\x7F\x45\x4C\x46..." > a.out
$ printf "\x7F\x45\x4C\x46..." > a.out
$ perl -e 'print pack('C2',0x98,0x99)' > b.out
而且,输出到二进制文件后还需要 chmod 才能运行的
$ chmod +x a.out

所以说 Linux 下,还是和 DOS 不同的。


不过,LZ还是很懂得钻研的,像我就没这个钻研的决心啊~
回复 支持 反对

使用道具 举报

发表于 2007-5-20 21:00:49 | 显示全部楼层
字串长度少了点
  1. 把倒数第2行的
  2. 90 04 08 BA  0C 00 00 00
  3. 改成
  4. 90 04 08 BA  [color=red]0D[/color] 00 00 00
  5. 就更完美了。
复制代码

-_-||| 不过感觉讨论这个没什么意义。。。。
回复 支持 反对

使用道具 举报

发表于 2007-5-20 23:11:36 | 显示全部楼层
就是两个系统调用,write, exit
考考楼主,字符串除了用这个地址之外0x8049074,还能用什么地址
回复 支持 反对

使用道具 举报

发表于 2007-5-20 23:24:36 | 显示全部楼层
这实在没啥意义
不如找点更有挑战性的
用小刀在磁盘上刻个操作系统吧
回复 支持 反对

使用道具 举报

发表于 2007-5-21 02:44:11 | 显示全部楼层
Post by souldump
前几天一直在忙一个网络程序,没时间弄,这几天给弄出来了,
写出来了,
7F 45 4C 46  01 01 01 00  00 00 00 00  00 00 00 00
02 00 03 00  01 00 00 00  84 80 04 08  34 00 00 00
74 00 00 00  00 00 00 00  34 00 20 00  02 00 00 00
00 00 00 00  01 00 00 00  00 00 00 00  00 80 04 08
00 80 04 08  A5 00 00 00  A5 00 00 00  05 00 00 00
00 01 00 00  01 00 00 00  74 00 00 00  74 90 04 08
74 90 04 08  0D 00 00 00  0D 00 00 00  06 00 00 00
00 01 00 00  48 65 6C 6C  6F 20 57 6F  72 6C 64 21
0A 00 00 00  B8 04 00 00  00 BB 01 00  00 00 B9 74
90 04 08 BA  0C 00 00 00  CD 80 B8 01  00 00 00 BB
00 00 00 00  CD 80 00 00

用16进制编辑器,输入,直接运行。
输出Hello World!
虽然没有像windows下的DEBUG那样,但是我相信,
有一天linux下会有和那个一样的工具的。

嗯,那真得恭喜你了。
以后别说我不懂操作系统原理了,太伤自尊了。

许多人听不得老实话,可能因为老实话往往比较刺耳吧。
回复 支持 反对

使用道具 举报

发表于 2007-5-21 10:24:48 | 显示全部楼层
我用C写个程序,然后用gcc编译成ELF文件,然后再dump出来,和LZ是一个效果,我相信要比LZ用的时间少几百倍(如果算上LZ钻研的时间)。
回复 支持 反对

使用道具 举报

发表于 2007-5-22 12:45:28 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2007-5-24 12:58:31 | 显示全部楼层
这种技术可以用在缓存溢出,然后让带有某种权限的进程去执行一段代码。 但是这个也用不到机器码阿,汇编就可以。
Unix上编程,把移植性放在第一,机器码? 难道就一定是intel的CPU了?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-24 14:51:59 | 显示全部楼层
这几天又在寝室猫着了,今天回来回下:

回2楼:
    感谢2楼,没错,的确我研究过汇编语言的编译然后得出的,如果直接写出机器码会很烦,而且容易忘记,但是,每个机器指令我都参考了intel的手册自己重新汇编了一便。而且这个程序的确还得chmod才能运行。
这是我那篇文章中的具体编码方式一节:
最核心的应该算是那几条指令编码:

eax 的寄存器选择位为0, ebx的为3, 根据mov指令中的:
B8+ rd     MOV r32, imm32   Move imm32 to r32.
以下两句:
        movl $4, %eax
        movl $1, %ebx
汇编为:
        B8 04 00 00 00
        BB 01 00 00 00
ECX的寄存器选择位为1.edx为2,第一句使用立即数寻址,虽然这是个变量,但是他存储的是地址。
从程序执行的角度来看,他存储的是字符串的的基地址。
所以下面两句:
        movl $output, %ecx         //随便取的名字。
        movl $13, %edx
汇编为:
        B9 XX XX XX XX (这里是字符串的首地址)
        BA 0D 00 00 00

这是int指令的描述:
CD ib     INT imm8           Interrupt vector number specified by                                                    immediate byte.
这句
        int $0x80
被汇编为:
        CD 80 (这里是一个字节啊,不是4个!)


        movl $1, %eax
        movl $0, %ebx
        int $0x80

很容易写出还是上面的:

        B8 01 00 00 00
        BB 00 00 00 00
        CD 80 00 00 //最后这俩是填充的。
回3楼:
     是啊,这个我给记错了,13让我给弄成C了,你看上面的这节就知道原因了。多谢指正。
回4楼:
   版主的意思我不太明白。我只定义了数据段和代码段分别存放数据和代码。我承认自己的水平有限。不知道是不是用ldt的基地址值去确定,因为低16位为长度,而数据段中那个字符串又放在开始,应该可以吧。我不知道对不对,希望请版主赐教。
回5楼:
    这的确没啥意思,要是你学会用机器码写病毒就有意思了。开个玩笑。我学习机器码只是更深刻的了解x86的编码方式和程序的运行机理而已。
回6楼:
    我并不是说你说的错,我承认,我的操作系统原理是不够强。但是我一直在努力学习,正是因为我无知,我才会去问,   虽然我研究linux内核很长时间,也只是停留在理论上的东西,整个学校,我连找个提问的都没有。说实话,我很感激你,因为你这么说证明我的确有错的地方,而且你愿意指出,这难道不好么。
回7楼:
    你只是说,你做过没?
这个是用汇编写的,然后编译出来的,共611个字节。
00000000   7F 45 4C 46  01 01 01 00  00 00 00 00  00 00 00 00  .ELF............
00000010   02 00 03 00  01 00 00 00  74 80 04 08  34 00 00 00  ........t...4...
00000020   CC 00 00 00  00 00 00 00  34 00 20 00  02 00 28 00  ........4. ...(.
00000030   06 00 03 00  01 00 00 00  00 00 00 00  00 80 04 08  ................
00000040   00 80 04 08  96 00 00 00  96 00 00 00  05 00 00 00  ................
00000050   00 10 00 00  01 00 00 00  98 00 00 00  98 90 04 08  ................
00000060   98 90 04 08  0D 00 00 00  0D 00 00 00  06 00 00 00  ................
00000070   00 10 00 00  B8 04 00 00  00 BB 01 00  00 00 B9 98  ................
00000080   90 04 08 BA  0C 00 00 00  CD 80 B8 01  00 00 00 BB  ................
00000090   00 00 00 00  CD 80 00 00  68 65 6C 6C  6F 20 77 6F  ........hello wo
000000A0   72 6C 64 21  0A 00 2E 73  79 6D 74 61  62 00 2E 73  rld!...symtab..s
000000B0   74 72 74 61  62 00 2E 73  68 73 74 72  74 61 62 00  trtab..shstrtab.
000000C0   2E 74 65 78  74 00 2E 64  61 74 61 00  00 00 00 00  .text..data.....
000000D0   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  ................
000000E0   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  ................
000000F0   00 00 00 00  1B 00 00 00  01 00 00 00  06 00 00 00  ................
00000100   74 80 04 08  74 00 00 00  22 00 00 00  00 00 00 00  t...t...".......
00000110   00 00 00 00  04 00 00 00  00 00 00 00  21 00 00 00  ............!...
00000120   01 00 00 00  03 00 00 00  98 90 04 08  98 00 00 00  ................
00000130   0D 00 00 00  00 00 00 00  00 00 00 00  04 00 00 00  ................
00000140   00 00 00 00  11 00 00 00  03 00 00 00  00 00 00 00  ................
00000150   00 00 00 00  A5 00 00 00  27 00 00 00  00 00 00 00  ........'.......
00000160   00 00 00 00  01 00 00 00  00 00 00 00  01 00 00 00  ................
00000170   02 00 00 00  00 00 00 00  00 00 00 00  BC 01 00 00  ................
00000180   80 00 00 00  05 00 00 00  04 00 00 00  04 00 00 00  ................
00000190   10 00 00 00  09 00 00 00  03 00 00 00  00 00 00 00  ................
000001A0   00 00 00 00  3C 02 00 00  27 00 00 00  00 00 00 00  ....<...'.......
000001B0   00 00 00 00  01 00 00 00  00 00 00 00  00 00 00 00  ................
000001C0   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  ................
000001D0   74 80 04 08  00 00 00 00  03 00 01 00  00 00 00 00  t...............
000001E0   98 90 04 08  00 00 00 00  03 00 02 00  01 00 00 00  ................
000001F0   98 90 04 08  00 00 00 00  00 00 02 00  08 00 00 00  ................
00000200   74 80 04 08  00 00 00 00  10 00 01 00  0F 00 00 00  t...............
00000210   A5 90 04 08  00 00 00 00  10 00 F1 FF  1B 00 00 00  ................
00000220   A5 90 04 08  00 00 00 00  10 00 F1 FF  22 00 00 00  ............"...
00000230   A8 90 04 08  00 00 00 00  10 00 F1 FF  00 6F 75 74  .............out
00000240   70 75 74 00  5F 73 74 61  72 74 00 5F  5F 62 73 73  put._start.__bss
00000250   5F 73 74 61  72 74 00 5F  65 64 61 74  61 00 5F 65  _start._edata._e
00000260   6E 64 00                                            nd.

而用C写的比用汇编写的在我机器上不加任何选项直接编译有4678个字节。
我的有168个字节你说哪个快?哪个效率高。
回8楼:
感谢您提供的连接。这个程序不错。我会有时间好好研究下代码。

最后我来做个总结。
     大家的争论和批评,对我来说的都是一种鼓励,而且我也很高兴,你们不知道,在学校里连个说话的都没,这里还能有人和我争论,给我挑毛病。这正验证了一句我自己的话“不较真,是对技术的不忠”。通过这个话题,让我学到了很多。

   关于ELF的执行和编译,而且对编译器也有了更深一步的了解。比如,平时我们那些高级语言中所用的变量,其实都不过是个符号,而在实际的机器语言里,这些都是无所谓的,而被转化成了空间、地址。而在可执行程序中这些都是不必要的,编译器之所以把它们保留只是为了调试而已。甚至如果你可以自己指定程序入口,你可以不要_start, 不要main().

    诚然,我时刻记得LINUX不是windows,二楼说的对,像windows那样随便就可以执行一段二进制的代码是不安全的,而且,DEBUG也是从DOS时代遗留下来的古董。LINUX从诞生之日起就已经不必再那么苦要调试机器码了。

     最后,我还是想说件事,如果真想写类似DEBUG的程序,可能并不是办不到,ELF代码可以简单到只有一个ELF头,一个程序头,和代码,其他的程序头,节头都可以不要,只使用代码段并添加可写标记,而在代码段中通过跳转来跳过存储数据的地址。再利用调试器的技术编写。而且写程序确定一些地址进行替换,应该不是难事。相信应该可以做到吧!当然这种技术不是我能做到的。
   
    呵呵!谢谢大家!
回复 支持 反对

使用道具 举报

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

本版积分规则

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