Linux/390shellcodedevelopment
2008-04-09 04:00:07来源:互联网 阅读 ()
Linux/390 shellcode development
转载:
来源:http://www.whitecell.org
==Phrack Inc.==
Volume 0x0b, Issue 0x3b, Phile #0x0d of 0x12
|=----------------=[ Linux/390 shellcode development ]=------------------=|
|=-----------------------------------------------------------------------=|
|=-------=[ johnny cyberpunk <jcyberpunk@thehackerschoice.com> ]=--------=|
|=-------=[ 整理:e4gle <e4gle@whitecell.org> from whitecell.org]=--------=|
--[ 目录
1 - 介绍
2 - 正文
2.1 - 寄存器
2.2 - 指令
2.3 - 系统调用
2.4 - 初始代码
2.5 - 避免0x00和0x0a
2.6 - 最终代码
3 - 参考资料
--[ 1 - 介绍
自从IBM发布了linux/390系统之后,关于它的越来越多的资料都可以在互联网上找到。如果
能一个hacker可以找到如何发现一个大型机的漏洞并且可以exploit它,那将是一件非常有
意义的事情。谁会是大型机的主人呢?对,一个大型的计算机中心,证券系统或者银行电信等。
好,在这篇文章中我将讲述如何在linux/390系统之上书写shellcode的方法。最后我会给出
一个shellcode的例子。
--[ 2 - 正文
最晚1998年一个来自Boeblingen/Germany的小型的IBM开发者团队开始将linux移植到大型机
上。一年后在1999年的12月底第一个版本发布叫IBM s/390。现在存在两个版本。
一个是32位的版本,运行linux系统在s/390上,另一个是64位的版本,运行linux在zSeries上。
支持distros和Suse,redhat和turbolinux。linux for s/390是基于内核版本2.2的,zSeries
是基于内核2.4的。有两种不同的运行linux的方法:
Native - 整个系统运行linux,没有其他操作系统
LPAR - 逻辑分区): 硬盘可以划分逻辑分区,例如,一块逻辑分区可以是一个VM/VSE环境
,另一块逻辑分区是linux。
VM/ESA Guest - 表示一个用户还可以在虚拟机上运行一个linux系统
二进制格式仍是ELF格式
----[ 2.1 - 寄存器
编写我们的shellcode我们没有必要知道s/390或zSeries的所有寄存器。我们最感兴趣的寄存器
是%r0-%r15。这里我还是在这里列出其他的寄存器,大概介绍一下,给大家有个直观的认识。
通用寄存器 :
%r0-%r15 或 gpr0-gpr15 被用来寻址操作和计算操作
控制寄存器 :
cr0-cr15仅被用作内核对irq的控制,内存管理,调试控制等等
地址寄存器 :
ar0-ar15通常不用于程序,但通常用于临时存储
浮点寄存器 :
fp0-fp15 有IEEE和HFP两种浮点类型( Linux只使用IEEE )
PSW ( 程序状态字 ) :
这是一个非常重要的寄存器,它充当了一个程序计数器,内存空间指示器和
条件码寄存器的角色。如果大家需要了解这些寄存器的详细信息,可以在文章
结尾部分的参考资料中得到帮助。
----[ 2.2 - 指令
下面我会介绍给大家一些开发我们的shellcode时需要用到的指令格式及语法。
指令 实例
---------------------------------------------------------------------------
basr (branch and save) %r1,0 # 保存0到寄存器%r1中
lhi (load h/word immediate) lhi %r4,2 # 加载2到寄存器%r4中
la (load address) la %r3,120(%r15) # 把%r15 120这个地址加载到寄存器%r3中
lr (load register) lr %r4,%r9 # 将寄存器%r9中的值加载到寄存器%r4中
stc (store character) stc %r6,120(%r15) # 从寄存器%r6存储一个字符到%r15 120中
sth (store halfword) sth %r3,122(%r15) # 从寄存器%r3存储两个字节到%r15 122中
ar (add) ar %r6,%r10 # 将两值相加存储到寄存器%r6中
xr (exclusive or) xr %r2,%r2 # 0x00 trick :)
svc (service call) svc 1 # 退出
----[ 2.3 - 系统调用
在s/390或zSeries的linux机器上系统调用是通过以0x0a为操作码调用SVC指令来实现。
这对我们的shellcoder来说并不是很有利,0x0a在大多数服务中是一个特殊字符。
但是在我开始试验我们如何避开这个使用这个调用的方法之前,让我们来看一下我们
的OS试如何使用系统调用的。
系统调用的首4个参数定义在寄存器%r2-%r5中,结果代码(resultcode)可以在
SVC调用之后在%r2中找到。
Example of an execve call:
下面是一个execve调用的例子:
basr %r1,0
base:
la %r2,exec-base(%r1)
la %r3,arg-base(%r1)
la %r4,tonull-base(%r1)
svc 11 ;e4gle add,估计这里的11就是11号系统调用execve
exec:
.string "/bin//sh"
arg:
.long exec
tonull:
.long 0x0
再举一个特殊的例子SVC调用102号系统调用(SYS_SOCKET)。首先我们必须在寄存器
%r2中填上相应的函数(socket,bind,listen,accept,等等),寄存器%r3指向该函数所需
参数的列表。每个列表中参数都是u_long的类型。
/*e4gle add
我个人认为这里地SYS_SOCKET系统调用之所以特殊,也是和普通linux的系统调用sys_socket
一样,它是一个函数组的借口,所以要指定相应的函数,看来还是大同小异:)
*/
来看看socket()调用的例子:
lhi %r2,2 # domain
lhi %r3,1 # type
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:给大家一个新的加密方法,C#的
下一篇:UNF
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash