歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> Unix教程 >> 簡析Linux與FreeBSD的syscall

簡析Linux與FreeBSD的syscall

日期:2017/2/27 17:40:12   编辑:Unix教程
FreeBSD

  --]概述

  又是一個不眠的夜晚,其實這篇文檔是不應該發表的,因為保密的原則吧,但是我仔細

  google了下,沒有類似的文章,而且發表的這部分文檔也不至於被認為是什麼絕密資料,

  但是我還是隱藏了很多發現的內核級別可能存在的問題:)單純從匯編代碼的結構來闡述

  下linux與freebsd到底那個更好玩一些.或者說那個運行速度會更快一些:)

  我想大家看完這個文檔以後,或許會知道到底是Linux穩固?還是FreeBSD穩固?

  在本文的最後部分,附加了shellcode的問題,但沒有專門的論述.

  備注:本文觀點僅代表個人觀點,如有不對的地方,歡迎大家指正:)以提高本人的水平.

  --]編譯調試

  A:編譯選項

  Linux :gcc -gdwarf-2 ***.c -o ***

  FreeBSD: cc -gdwarf-2 ***.c -o ***

  為了調試方便,我使用了上面的選項.

  --------------------------------------

  對於一般書寫shellcode的編譯選項一般為:

  Linux :gcc -static -o *** ***.c

  FreeBSD: cc -static -o *** ***.c

  B:調試工具

  Linux/Unix下面的調試工具為GDB,但是GDB基於內核的調試有些力不從心,因為GDB的調試是

  基於用戶模式(User mode).

  這裡我使用了其它的調試工具,所以下面大家看到的調試代碼比較特殊,在這裡事先聲明.

  --]Linux的syscall跟蹤

  寫過shellcode的人都知道syscall是寫shellcode的必需品:)當然這種概念只在Linux/Unix

  的OS下才存在.最近這段時間因為一個"小小的問題"對Linux內核與FreeBSD的內核級別進行了

  跟蹤和調試,然後發現一個蠻有意思的問題,自己感覺這個問題可能會與Linux下shellcode與

  FreeBSD下shellcode的不同有關系,當然也和系統架構存在一些細微的關系.下面的內容是Linux

  下面syscall的一些匯編代碼.

  在Linux下面,Application調用syscall的代碼如下:

  420D4330 55 PUSH EBP |

  420D4331 89E5 MOV EBP,ESP |->堆棧框架

  420D4333 83EC18 SUB ESP,00000018 |

  420D4336 897DFC MOV dword ptr [EBP]-04,EDI |

  420D4339 8B4D0C MOV ECX,dword ptr [EBP]+0c |

  420D433C 8B7D08 MOV EDI,dword ptr [EBP]+08 |->syscall參數

  420D433F 8975F8 MOV dword ptr [EBP]-08,ESI |

  420D4342 8B5510 MOV EDX,dword ptr [EBP]+10 |

  420D4345 895DF4 MOV dword ptr [EBP]-0c,EBX

  420D4348 E81014F4FF CALL near32 ptr 4201575d

  420D434D 81C3835F0500 ADD EBX,00055f83

  420D4353 8D77FF LEA ESI,dword ptr [EDI]-01

  420D4356 83FE02 CMP ESI,00000002

  420D4359 8D75F0 LEA ESI,dword ptr [EBP]-10

  420D435C 0F477514 CMOVA ESI,dword ptr [EBP]+14

  420D4360 53 PUSH EBX

  420D4361 89FB MOV EBX,EDI

  420D4363 B81A000000 MOV EAX,0000001c //system call number value

  420D4368 CD80 INT 80 //調用0x80

  420D436A 5B POP EBX

  420D436B 3D00F0FFFF CMP EAX,fffff000

  420D4370 89C6 MOV ESI,EAX

  420D4372 760E JBE short ptr 420d4382

  420D4374 F7DE NEG ESI

  420D4376 E8C912F4FF CALL near32 ptr 42015644

  420D437B 8930 MOV dword ptr [EAX],ESI

  420D437D BEFFFFFFFF MOV ESI,ffffffff

  420D4382 85F6 TEST ESI,ESI

  420D4384 782A JS short ptr 420d43b0

  420D4386 85FF TEST EDI,EDI

  420D4388 7426 JE short ptr 420d43b0

  420D438A 83FF03 CMP EDI,00000003

  420D438D 7721 JA short ptr 420d43b0

  420D438F E8B012F4FF CALL near32 ptr 42015644

  420D4394 C70000000000 MOV dword ptr [EAX],00000000

  420D439A 8B45F0 MOV EAX,dword ptr [EBP]-10

  420D439D 8B5DF4 MOV EBX,dword ptr [EBP]-0c

  420D43A0 8B75F8 MOV ESI,dword ptr [EBP]-08

  420D43A3 8B7DFC MOV EDI,dword ptr [EBP]-04

  420D43A6 89EC MOV ESP,EBP

  420D43A8 5D POP EBP

  420D43A9 C3 RETN

  ---------------------------------------------------------------------

Copyright © Linux教程網 All Rights Reserved