Linux/390shellcodedevelopment

2008-04-09 04:00:07来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折



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