锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
1. 涓涓俊鍙峰皬渚嬪瓙
hex@Gentoo ~/signal $ cat sigint.c
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void sig_int(int signo)
{
printf("hello\n");
}
int main()
{
if(signal(SIGINT, sig_int) == SIG_ERR){
printf("can't catch SIGINT\n");
exit(-1);
}
for(;;)
;
return 0;
}
2. 鐢ㄦ埛鍫嗘爤閲屽彂鐢熺殑鏁呬簨
2.1 緙栬瘧榪愯璇ョ▼搴?騫惰緗柇鐐瑰湪sig_int鍑芥暟寮澶?0x80482e8)錛屽茍璁劇疆SIGINT淇″彿鐨勫鐞嗘柟寮?br />hex@Gentoo ~/signal $ gdb ./sigint
(gdb) b *0x80482e8
Breakpoint 1 at 0x80482e8: file sigint.c, line 6.
(gdb) handle SIGINT noprint pass
SIGINT is used by the debugger.
Are you sure you want to change it? (y or n) y
Signal Stop Print Pass to program Description
SIGINT No No Yes Interrupt
(gdb) r
Starting program: /home/gj/signal/sigint
2.2 鍚戣紼嬪簭鍙戦佷俊鍙? kill -INT 姝ょ▼搴忕殑pid鍙?br />hex@Gentoo ~/signal $ kill -INT 4639
2.3 璇ョ▼搴忔敹鍒頒俊鍙峰悗鍋滃湪鏂偣澶?br />Breakpoint 1, sig_int (signo=2) at sigint.c:6
6 {
(gdb) i r esp
esp 0xbfffe7ec 0xbfffe7ec
(gdb) x/40a 0xbfffe7ec
0xbfffe7ec: 0xb7fff400 0x2 0x33 0x0
0xbfffe7fc: 0x7b 0x7b 0x8048930 <__libc_csu_init> 0x80488f0 <__libc_csu_fini>
0xbfffe80c: 0xbfffed58 0xbfffed40 0x0 0x0
0xbfffe81c: 0xbfffec18 0x0 0x0 0x0
0xbfffe82c: 0x8048336 <main+58> 0x73 0x213 0xbfffed40
0xbfffe83c: 0x7b 0xbfffead0 0x0 0x0
0xbfffe84c: 0x0 0x0 0x0 0x0
0xbfffe85c: 0x0 0x0 0x0 0x0
0xbfffe86c: 0x0 0x0 0x0 0x0
0xbfffe87c: 0x0 0x0 0x0 0x0
鏍堜笂鐨勫唴瀹逛負淇″彿鏍坰igframe錛?br />鏍規嵁姝ょ粨鏋勫彲浠ョ煡閬擄細
1). 榪斿洖鍦板潃0xb7fff400錛屽畠鎸囧悜vdso閲岀殑sigreturn
(gdb) x/10i 0xb7fff400
0xb7fff400 <__kernel_sigreturn>: pop %eax
0xb7fff401 <__kernel_sigreturn+1>: mov $0x77,%eax
0xb7fff406 <__kernel_sigreturn+6>: int $0x80
榪欎釜鍦板潃鏍規嵁鍐呮牳鐨勪笉鍚岃屼笉鍚岋紝鎴戠殑鍐呮牳鐗堟湰鏄?.6.38銆?br />2). 淇″彿澶勭悊紼嬪簭瀹屾垚鍚庯紝浼氬洖鍒?eip = 0x8048336 鐨勫湴鍧緇х畫鎵ц銆?br />
2.4 鎵ц瀹宻ig_int鍑芥暟鍚庯紝榪涘叆浜哶_kernel_sigreturn錛屾帴鐫鍥炲埌浜嗕唬鐮?x8048336澶勶紝涓鍒囨仮澶嶄簡姝e父銆?br />(gdb) x/5i $pc
=> 0x8048336 <main+58>: jmp 0x8048336 <main+58>
(gdb) i r esp
esp 0xbfffed40 0xbfffed40
鍦ㄧ敤鎴峰眰鎴戜滑鑳界湅鍒扮殑鍙湁涓婇潰榪欎箞澶氫俊鎭簡錛屽彲鑳芥湁涓涓湴鏂逛笉鑳界悊瑙o細鍦ㄤ笂闈㈣繃紼媍涓?浠?xbfffe7ec璧烽偅涓鍧楁爤涓婄殑鍐呭浠庡摢鏉ョ殑錛燂紙姝e父鎯呭喌涓嬪爢鏍坋sp搴旇涓鐩存寚鍚戝湪榪囩▼d涓樉紺虹殑esp鍊?xbfffed40錛?br />
鐜板湪鏉ョ湅鐪嬪湪涓婇潰榪欎簺鐜拌薄涔嬩笅錛屽唴鏍哥殑鍫嗘爤鍙戠敓浜嗘庢牱鐨勫彉鍖栥?br />
3. 鍐呮牳鍫嗘爤閲屽彂鐢熺殑鏁呬簨
3.1 鍙戜俊鍙鋒椂
鍦?2.2 閲屽綋鎵цkill -INT 4639鍚庯紝pid涓?639鐨勭▼搴忥紙涔熷氨鏄垜浠繍琛岀殑 ./sigint錛変細鏀跺埌涓涓俊鍙鳳紝浣嗘槸淇″彿瀹為檯閮芥槸鍦ㄥ唴鏍擱噷瀹炵幇鐨勩傛瘡涓繘紼嬶紙榪欓噷鍙榪涚▼鐨勬儏鍐碉紝綰跨▼綾諱技錛岀嚎紼嬫湁涓涓猼id錛夐兘鏈変竴涓猵id錛屼笌姝id瀵瑰簲鏈変竴涓粨鏋?task_struct 錛屽湪task_struct閲屾湁涓涓彉閲?struct sigpending pending錛屽綋璇ヨ繘紼嬫敹鍒頒俊鍙鋒椂錛屽茍涓嶄細绔嬪嵆浣滃嚭鍙嶅簲錛屽彧鏄鍐呮牳鎶婅繖涓俊鍙瘋鍦ㄤ簡姝ゅ彉閲忛噷錛堝畠閲岄潰鏄竴涓摼琛ㄧ粨鏋勶級銆傚綋鐒訛紝姝ゆ椂涓庡唴鏍稿爢鏍堣繕娌℃湁澶氬ぇ鍏崇郴銆?br />
3.2 媯嫻嬩俊鍙?br /> 濡傛灉鍙褰曚簡淇″彿錛屼絾娌℃湁鐩稿簲鍙嶅簲錛岄偅鏈変粈涔堢敤鍟娿備竴涓繘紼嬪湪浠涔?鎯呭喌涓嬩細媯嫻嬩俊鍙風殑瀛樺湪鍛紵鍦?lt;鎯呮櫙鍒嗘瀽>閲岃鍒頒簡錛?#8220;鍦ㄤ腑鏂満鍒朵腑錛屽鐞嗗櫒鐨勭‖浠跺湪姣忔潯鎸囦護緇撴潫鏃墮兘瑕佹嫻嬫槸鍚︽湁涓柇璇鋒眰鐨勫瓨鍦ㄣ備俊鍙鋒満鍒舵槸綰蔣浠剁殑錛屽綋鐒朵笉鑳戒緷闈犵‖浠舵潵媯嫻嬩俊鍙風殑鍒版潵銆傚悓鏃訛紝瑕佸湪姣忔潯鎸囦護緇撴潫鏃墮兘鏉ユ嫻嬫樉鐒舵槸涓嶇幇瀹炵殑錛岀敋鑷蟲槸涓嶅彲鑳界殑銆傛墍浠ュ淇″彿鐨勬嫻嬫満鍒舵槸錛氭瘡褰撲粠緋葷粺璋冪敤錛屼腑鏂鐞嗘垨寮傚父澶勭悊榪斿洖鍒扮敤鎴風┖闂寸殑鍓嶅錛涜繕鏈夊氨鏄綋榪涚▼琚粠鐫$湢涓敜閱掞紙蹇呭畾鏄湪緋葷粺璋冪敤涓級鐨勬椂鍊欙紝姝ゆ椂鑻ュ彂鐜版湁淇″彿鍦ㄧ瓑寰呭氨瑕佹彁鍓嶄粠緋葷粺璋冪敤榪斿洖銆傛昏岃█涔嬶紝涓嶇鏄甯歌繑鍥炶繕鏄彁鍓嶈繑鍥烇紝鍦ㄨ繑鍥炲埌鐢ㄦ埛絀洪棿鐨勫墠澶曟繪槸瑕佹嫻嬩俊鍙風殑瀛樺湪騫朵綔鍑哄弽搴斻?#8221;
鍥犳錛屽鏀跺埌鐨勪俊鍙峰仛鍑哄弽搴旂殑鏃墮棿鏄?浠庡唴鏍歌繑鍥炵敤鎴風┖闂寸殑鍓嶅錛岄偅涔堟湁閭d簺鎯呭喌浼氳紼嬪簭榪涘叆鍐呮牳鍛紵絳旀鏄腑鏂紝寮傚父鍜岀郴緇熻皟鐢ㄣ傜畝鍗曚簡瑙d竴涓嬪畠浠彂鐢熸椂鍐呮牳鍫嗘爤鐨勫彉鍖栥?br /> //-----涓柇錛屽紓甯革紝緋葷粺璋冪敤 : 寮濮?
1)鍦ㄧ敤鎴風┖闂村彂鐢熶腑鏂椂錛孋PU浼氳嚜鍔ㄥ湪鍐呮牳絀洪棿淇濆瓨鐢ㄦ埛鍫嗘爤鐨凷S錛?鐢ㄦ埛鍫嗘爤鐨凟SP錛?EFLAGS, 鐢ㄦ埛絀洪棿鐨凜S, EIP, 涓柇鍙?- 256
| 鐢ㄦ埛鍫嗘爤鐨凷S | 鐢ㄦ埛鍫嗘爤鐨凟SP | EFLAGS | 鐢ㄦ埛絀洪棿鐨凜S | EIP | 涓柇鍙?錛?256
榪涘叆鍐呮牳鍚庯紝浼氳繘琛屼竴涓猄AVE_ALL錛岃繖鏍峰唴鏍告爤涓婄殑鍐呭涓猴細
| 鐢ㄦ埛鍫嗘爤鐨凷S | 鐢ㄦ埛鍫嗘爤鐨凟SP | EFLAGS | 鐢ㄦ埛絀洪棿鐨凜S | EIP | 涓柇鍙?錛?256 | ES | DS | EAX | EBP | EDI | ESI | EDX | ECX | EBX
濂戒簡錛屼竴鍒囬兘澶勭悊瀹屾椂錛屽唴鏍竕mp鍒癛ESTORE_ALL錛堝畠鏄竴涓畯錛屼緥錛氬湪x86_32浣撶郴緇撴瀯涓嬶紝/usr/src/kernel/arch/286/kernel/entry_32.S鏂囦歡閲屽寘鍚瀹忕殑瀹氫箟錛?br />
RESTORE鍋氱殑宸ヤ綔錛屼粠瀹冪殑浠g爜閲屽氨鍙互鐪嬪嚭鏉ヤ簡錛?nbsp;
棣栧厛鎶婃爤涓婄殑 ES | DS | EAX | EBP | EDI | ESI | EDX | ECX | EBX pop鍒板搴旂殑瀵勫瓨鍣ㄩ噷
鐒跺悗灝唀sp 錛?4 鎶?“涓柇鍙?錛?256” pop鎺?
姝ゆ椂鍐呮牳鏍堜笂鐨勫唴瀹逛負錛?br /> | 鐢ㄦ埛鍫嗘爤鐨凷S | 鐢ㄦ埛鍫嗘爤鐨凟SP | EFLAGS | 鐢ㄦ埛絀洪棿鐨凜S | EIP
鏈鍚庢墽琛宨ret鎸囦護錛屾鏃禖PU浼氫粠鍐呮牳鏍堜笂鍙栧嚭SS, ESP, ELFGAS, CS, EIP錛岀劧鍚庢帴鐫榪愯銆?br />
2) 鍦ㄧ敤鎴風┖闂村彂鐢熷紓甯告椂錛孋PU鑷姩淇濆瓨鍦ㄥ唴鏍告爤鐨勫唴瀹逛負錛?br /> | 鐢ㄦ埛鍫嗘爤鐨凷S | 鐢ㄦ埛鍫嗘爤鐨凟SP | EFLAGS | 鐢ㄦ埛絀洪棿鐨凜S | EIP | 鍑洪敊浠g爜 error_code
錛堟敞錛欳PU鍙槸鍦ㄨ繘鍏ュ紓甯告椂鎵嶇煡閬撴槸鍚﹀簲璇ユ妸鍑洪敊浠g爜鍘嬪叆鍫嗘爤錛堜負浠涔?錛夛紝鑰屼粠寮傚父澶勭悊閫氳繃iret鎸囦護榪斿洖鏃跺凡緇忔椂榪囧榪侊紝CPU宸茬粡鏃犱粠鐭ュ綋鍒濆彂鐢熷紓甯哥殑鍘熷洜錛屽洜姝や笉浼氳嚜鍔ㄨ煩榪囪繖涓欏癸紝鑰岃闈犵浉搴旂殑寮傚父澶勭▼搴忓鍫嗘爤鍔犱互璋冩暣錛屼嬌寰楀湪CPU寮濮嬫墽琛宨ret鎸囦護鏃跺爢鏍堥《閮ㄦ槸榪斿洖鍦板潃錛?br />
榪涘叆鍐呮牳鍚庯紝娌℃湁榪涜SAVE_ALL錛岃屾槸榪涘叆鐩稿簲鐨勫紓甯稿鐞嗗嚱鏁幫紙榪欎釜鍑芥暟鏄寘瑁呭悗鐨勶紝鐪熸鐨勫鐞嗗嚱鏁板湪鍚庨潰錛夛紙鍦ㄦ鍑芥暟閲屼細鎶婄湡姝g殑澶勭悊鍑芥暟鐨勫湴鍧push鍒版爤涓婏級錛岀劧鍚巎mp鍒板悇縐嶅紓甯稿鐞嗘墍鍏辯敤鐨勭▼搴忓叆鍙rror_code錛屽畠浼氬儚SAVE_ALL閭f牱淇濆瓨鐩稿簲鐨勫瘎瀛樺櫒錛堟病鏈変繚瀛楨S錛夛紝姝ゆ椂鍐呮牳絀洪棿涓婄殑鍐呭涓猴細
| 鐢ㄦ埛鍫嗘爤鐨凷S | 鐢ㄦ埛鍫嗘爤鐨凟SP | EFLAGS | 鐢ㄦ埛絀洪棿鐨凜S | EIP | 鍑洪敊浠g爜 error_code | 鐩稿簲寮傚父澶勭悊鍑芥暟鍏ュ彛 | DS | EAX | EBP | EDI | ESI | EDX | ECX | EBX
錛堟敞錛氬鏋滄病鏈夊嚭閿欎唬鐮侊紝鍒欐鍊間負0錛?br />
鏈鍚庣粨鏉熸椂涓庝腑鏂被浼鹼紙RESTORE_ALL錛夈?br />
3) 鍙戠敓緋葷粺璋冪敤鏃訛紝CPU鑷姩淇濆瓨鍦ㄥ唴鏍告爤鐨勫唴瀹逛負:
| 鐢ㄦ埛鍫嗘爤鐨凷S | 鐢ㄦ埛鍫嗘爤鐨凟SP | EFLAGS | 鐢ㄦ埛絀洪棿鐨凜S | EIP
涓轟簡涓庝腑鏂拰寮傚父鐨勬爤涓鑷達紝鍦ㄨ繘鍏ョ郴緇熻皟鐢ㄥ叆鍙o紙ENTRY(system_call)錛夊悗浼氶鍏坧ush %eax錛岀劧鍚庤繘琛孲AVE_ALL錛屾鏃跺唴鏍告爤涓婄殑鍐呭涓?br /> | 鐢ㄦ埛鍫嗘爤鐨凷S | 鐢ㄦ埛鍫嗘爤鐨凟SP | EFLAGS | 鐢ㄦ埛絀洪棿鐨凜S | EIP | EAX | ES | DS | EAX | EBP | EDI | ESI | EDX | ECX | EBX
鏈鍚庣粨鏉熸椂涓庝腑鏂被浼鹼紙RESTORE_ALL錛夈?br /> //-----涓柇錛屽紓甯革紝緋葷粺璋冪敤 : 緇撴潫
涓柇錛屽紓甯革紝緋葷粺璋冪敤榪欓儴鍒嗘湁涓鐐歸仐婕忕殑鍦版柟錛氭嫻嬩俊鍙風殑鏃舵満灝辨槸绱ф尐鐫RESTORE_ALL涔嬪墠鍙戠敓鐨勩?br />
3.3 瀵規嫻嬪埌鐨勪俊鍙峰仛鍑哄弽搴?br /> 濡傛灉媯嫻嬪埌鏈夎澶勭悊鐨勪俊鍙鋒椂錛屽氨瑕佸紑濮嬪仛涓浜涘噯澶囧伐浣滀簡錛屾鏃跺唴鏍擱噷鐨勫唴瀹逛負錛堣繘鍏ュ唴鏍哥幇鍦烘椂鐨勫唴瀹癸級
| 鐢ㄦ埛鍫嗘爤鐨凷S1 | 鐢ㄦ埛鍫嗘爤鐨凟SP1 | EFLAGS1 | 鐢ㄦ埛絀洪棿鐨凜S1 | EIP1 | ? | ES1 | DS1 | EAX1 | EBP1 | EDI1 | ESI1 | EDX1 | ECX1 | EBX1
錛堟敞錛氾紵鐨勫兼湁涓変釜閫夋嫨錛氫腑鏂彿 錛?256錛忓嚭閿欎唬鐮?error_code錛忓嚭閿欎唬鐮?error_code錛?
鍋囪灝嗚澶勭悊鐨勪俊鍙峰搴旂殑淇″彿澶勭悊紼嬪簭鏄敤鎴瘋嚜宸辮緗殑錛屽嵆鏈枃涓璖IGINT瀵瑰簲鐨勪俊鍙峰鐞嗙▼搴弒ig_int銆?br /> 鐜板湪瑕佸仛鐨勪簨鎯呮槸璁ヽpu鍘繪墽琛屼俊鍙峰鐞嗙▼搴弒ig_int錛屼絾鏄墽琛屽墠闇瑕佸仛濂藉噯澶囧伐浣滐細
3.3.1 setup_frame
鍦ㄧ敤鎴風┖闂磋緗ソ淇″彿鏍?struct sigframe)(鍋囪璁劇疆濂芥爤鍚巈sp鐨勫間負sigframe_esp錛屽湪鏈枃涓叾鍊間負0xbfffe7ec)錛屽嵆鍦?.3閲岀湅鍒扮殑鏍堝唴瀹廣?br /> 娉細struct sigframe閲岃嚦灝戝寘鍚互涓嬪唴瀹癸細
鐢ㄦ埛鍫嗘爤鐨凷S1錛?鐢ㄦ埛鍫嗘爤鐨凟SP1錛?EFLAGS1錛?鐢ㄦ埛絀洪棿鐨凜S1錛?EIP1錛?ES1錛?DS1錛?EAX1錛?EBP1錛?EDI1錛?ESI1錛?EDX1錛?ECX1錛?EBX1
3.3.2 璁劇疆鍗沖皢榪愯鐨別ip鐨勫間負淇″彿澶勭悊鍑芥暟sig_int鐨勫湴鍧錛堜負0x80482e8錛夛紝騫惰緗敤鎴稥SP鐨勫間負sigframe_esp(涓?xbfffe7ec)錛岃繖鏄氳繃淇敼鍐呮牳鏍堥噷鐨凟IP鍜孍SP鐨勫煎疄鐜扮殑錛屽洜涓哄湪浠庣郴緇熻皟鐢ㄩ噷iret鏃訛紝浼氫粠鍐呮牳鏍堥噷鍙朎IP錛孍SP銆?br /> 榪欐椂鍐呮牳鏍堢殑鍐呮牳涓?
| 鐢ㄦ埛鍫嗘爤鐨凷S1 | 0xbfffe7ec | EFLAGS1 | 鐢ㄦ埛絀洪棿鐨凜S1 | 0x80482e8 | ? | ES1 | DS1 | EAX1 | EBP1 | EDI1 | ESI1 | EDX1 | ECX1 | EBX1
鏈鍚庯紝榪涜RESTORE_ALL錛屽唴鏍告爤涓婄殑鍐呭涓猴細
| 鐢ㄦ埛鍫嗘爤鐨凷S1 | 0xbfffe7ec | EFLAGS1 | 鐢ㄦ埛絀洪棿鐨凜S1 | 0x80482e8
RESTORE_ALL閲屾墽琛屽畬iret鍚庯紝瀵勫瓨鍣ㄥ唴瀹逛負錛?EIP涓?x80482e8(鍗硈ig_int),esp涓?xbfffe7ec 銆?浜庢槸鐢ㄦ埛絀洪棿鍒頒簡姝ラ 2.3
3.4 淇″彿澶勭悊紼嬪簭瀹屾垚浠ュ悗
2.3 -> 2.4錛岃繘鍏ヤ簡sig_return緋葷粺璋冪敤錛屽湪sig_return閲岋紝鍐呮牳鏍堢殑鍐呭涓猴紙姣忎釜鍚嶅瓧鍚庨潰鍔犱竴涓?浠ヤ究涓庡墠闈㈢殑1鍖哄垎錛?br /> | 鐢ㄦ埛鍫嗘爤鐨凷S2 | 鐢ㄦ埛鍫嗘爤鐨凟SP2 | EFLAGS2 | 鐢ㄦ埛絀洪棿鐨凜S2 | EIP2 | ? | ES2 | DS2 | EAX2 | EBP2 | EDI2 | ESI2 | EDX2 | ECX2 | EBX2
sig_return瑕佸仛鐨勪富瑕佸伐浣滃氨鏄牴鎹敤鎴鋒爤閲宻igframe鐨勫間慨鏀瑰唴鏍告爤閲岀殑鍐呭錛屼嬌鍐呮牳鏍堝彉涓?
| 鐢ㄦ埛鍫嗘爤鐨凷S1 | 鐢ㄦ埛鍫嗘爤鐨凟SP1 | EFLAGS1 | 鐢ㄦ埛絀洪棿鐨凜S1 | EIP1 | ? | ES1 | DS1 | EAX1 | EBP1 | EDI1 | ESI1 | EDX1 | ECX1 | EBX1
鑷蟲鍐呮牳鏍堥噷鐨勫唴瀹瑰拰榪涜淇″彿澶勭悊鍓嶄竴鏍蜂簡銆傜粡榪嘡ESTORE_ALL鍚庯紝鐢ㄦ埛鍫嗘爤閲岀殑鍐呭涔熷拰浠ュ墠涓鏍鳳紙涓昏鎸嘐SP鐨勫間竴鏍鳳級銆?
"kill -INT 4639" 鍙槸涓孌靛皬鎻掓洸銆傜▼搴忎粠鍘熷寮濮嬭繍琛屻?/div>
]]>
.... 錛涢氳繃瀵勫瓨鍣ㄤ紶鍙? mov $n ,eax 錛涘皢緋葷粺璋冪敤鍙鋒斁鍒癳ax涓? int 0x80
sysenter/sysexit鐨勫嚭鍦?/strong>
鍦ㄤ竴涓狵ernel.org鐨勯偖浠跺垪琛ㄤ腑錛屾湁涓灝侀偖浠惰璁轟簡“"Intel P6 vs P7 system call performance”錛屾渶鍚庡緱鍑虹殑緇撹鏄噰鐢ㄤ紶緇熺殑int 0x80鐨勭郴緇熻皟鐢ㄦ氮璐逛簡寰堝鏃墮棿錛堝叿浣撳師鍥犲彲浠ョ湅鍙傝冭祫鏂?錛夛紝鑰宻ysenter/sysexit鍙互寮ヨˉ榪欎釜緙虹偣錛屾墍浠ュ喅瀹氬湪linux鍐呮牳涓敤鍚庨兘鏇挎崲鍓嶈咃紙鏈緇堝湪2.6鐗堟湰鐨勫唴鏍鎬腑鎵嶅姞鍏ヤ簡姝ゅ姛鑳斤紝鍗抽噰鐢╯ysenter/sysexit錛夈?/p>
鍦ㄦ浛鎹箣鍓嶉鍏堥渶瑕佺煡閬撴弧瓚沖涓嬫潯浠剁殑ntel鏈哄櫒鎵嶄細鏈塻ysenter/sysexit鎸囦護瀵癸細Family >= 6錛孧odel >= 3錛孲tepping >= 3
濡備綍鐢ㄦ浛鎹ysenter/sysexit鏇挎崲浠ュ墠鐨刬nt 0x80鍛紵linux kenerl 闇瑕佽冭檻鍒拌繖鐐癸細鏈夌殑鏈哄櫒騫朵笉鏀寔sysenter/sysexit 錛?浜庢槸瀹冭窡glibc璇村ソ浜嗭紝“浣犱互鍚庤皟鐢ㄧ郴緇熻皟鐢ㄧ殑鏃跺欏氨浠庢垜緇欎綘鐨勮繖涓湴鍧璋冪敤錛岃繖涓湴鍧鎸囧悜鐨勫唴瀹硅涔堟槸int 0x80璋冪敤鏂瑰紡錛岃涔堟槸sysenter/sysexit璋冪敤鏂瑰紡錛屾垜浼氭牴鎹満鍣ㄦ潵閫夋嫨鍏朵腑涓涓?#8221;錛坘ernel涓巊libc鐨勯厤鍚堟槸濡傛鐨勯粯濂戯級錛岃繖涓湴鍧渚挎槸vsyscall鐨勯鍦板潃銆?/p>
鍙互灝唙dso鐪嬫垚涓涓猻hared objdect file錛堣繖涓枃浠跺疄闄呬笂涓嶅瓨鍦級,鍐呮牳灝嗗叾鏄犲皠鍒版煇涓湴鍧絀洪棿錛岃鎵鏈夌▼搴忔墍鍏變韓銆傦紙鎴戣寰楄繖閲岀敤鍒頒簡涓涓妧鏈細澶氫釜铏氭嫙欏甸潰鏄犲皠鍒板悓涓涓墿鐞嗛〉闈€傚嵆鍐呮牳鎶妚dso鏄犲皠鍒版煇涓墿鐞嗛〉闈笂錛岀劧鍚庢墍鏈夌▼搴忛兘浼氭湁涓涓〉琛ㄩ」鎸囧悜瀹冿紝浠ユ鏉ュ叡浜紝榪欐牱姣忎釜紼嬪簭鐨剉dso鍦板潃灝卞彲浠ヤ笉鐩稿悓浜嗭級
hex108@ubuntu:~/program$ uname -a Linux ubuntu 2.6.35-22-generic #33-Ubuntu SMP Sun Sep 19 20:34:50 UTC 2010 i686 GNU/Linux
hex108@ubuntu:~/program$ sudo sysctl -w kernel.randomize_va_space=0 //榪欎釜鏄繀欏葷殑錛屽惁鍒檝dso鐨勫湴鍧鏄殢鏈虹殑(vsyscall鐨勫湴鍧涔熶細鐩稿簲// 鍦板彂鐢?/span>鍙樺寲 )錛?/font>鍦ㄤ笅闈d鐨勬椂鍊欏氨浼氬嚭鐜伴敊璇?/span>
//dd: reading `/proc/self/mem': Input/output error
kernel.randomize_va_space = 0 hex108@ubuntu:~/program$ cat /proc/self/maps 00110000-0012c000 r-xp 00000000 08:01 260639 /lib/ld-2.12.1.so 0012c000-0012d000 r--p 0001b000 08:01 260639 /lib/ld-2.12.1.so 0012d000-0012e000 rw-p 0001c000 08:01 260639 /lib/ld-2.12.1.so 0012e000-0012f000 r-xp 00000000 00:00 0 [vdso] 0012f000-00286000 r-xp 00000000 08:01 260663 /lib/libc-2.12.1.so 00286000-00287000 ---p 00157000 08:01 260663 /lib/libc-2.12.1.so 00287000-00289000 r--p 00157000 08:01 260663 /lib/libc-2.12.1.so 00289000-0028a000 rw-p 00159000 08:01 260663 /lib/libc-2.12.1.so 0028a000-0028d000 rw-p 00000000 00:00 0 08048000-08051000 r-xp 00000000 08:01 130326 /bin/cat 08051000-08052000 r--p 00008000 08:01 130326 /bin/cat 08052000-08053000 rw-p 00009000 08:01 130326 /bin/cat 08053000-08074000 rw-p 00000000 00:00 0 [heap] b7df0000-b7ff0000 r--p 00000000 08:01 660864 /usr/lib/locale/locale-archive b7ff0000-b7ff1000 rw-p 00000000 00:00 0 b7ffd000-b7ffe000 r--p 002a1000 08:01 660864 /usr/lib/locale/locale-archive b7ffe000-b8000000 rw-p 00000000 00:00 0 bffdf000-c0000000 rw-p 00000000 00:00 0 [stack]hex108@ubuntu:~/program$ dd if=/proc/self/mem of=gate.so bs=4096 skip=$[0x12e] count=1 dd: `/proc/self/mem': cannot skip to specified offset 1+0 records in 1+0 records out 4096 bytes (4.1 kB) copied, 0.00176447 s, 2.3 MB/s hex108@ubuntu:~/program$ file gate.so gate.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped hex108@ubuntu:~/program$ objdump -d gate.so gate.so: file format elf32-i386 Disassembly of section .text: ffffe400 <__kernel_sigreturn>: ffffe400: 58 pop %eax ffffe401: b8 77 00 00 00 mov $0x77,%eax ffffe406: cd 80 int $0x80 ffffe408: 90 nop ffffe409: 8d 76 00 lea 0x0(%esi),%esi ffffe40c <__kernel_rt_sigreturn>: ffffe40c: b8 ad 00 00 00 mov $0xad,%eax ffffe411: cd 80 int $0x80 ffffe413: 90 nop ffffe414 <__kernel_vsyscall>: ffffe414: cd 80 int $0x80 ffffe416: c3 retsyscall 鎵嶆槸鏈鍚庣殑璧㈠錛?/strong>
x86 64浣嶄粠AMD寮曡繘浜唖yscall鎸囦護錛堟垜鍦▁86 64鐨勬満鍣ㄤ笂錛岀湅鍒扮殑緇撴灉鏄痵yscall鍙栦唬浜唖ysenter/sysexit錛堟墍鏈夌殑緋葷粺璋冪敤鐢ㄧ殑閮芥槸syscall錛夛級錛屼絾鏄痸dso,vsyscall鐨勬満鍒朵緷鏃ф湭鍙橈紝鍙槸kernel鍐沖畾鍙湪閬囧埌浠ヤ笅鍑犱釜緋葷粺璋冪敤gettimeofday,time鍜実etcpu錛堥氳繃鍐呮牳閲寁syscall.h涓璭num vsyscall_num鐨勫0鏄庣湅鍑烘潵錛屾垨鑰呭湪glibc婧愪唬鐮佷腑鎼滅儲“VSYSCALL_ADDR_”(
#define VSYSCALL_ADDR_vgettimeofday 0xffffffffff600000
#define VSYSCALL_ADDR_vtime 0xffffffffff600400
#define VSYSCALL_ADDR_vgetcpu 0xffffffffff600800
)錛夋椂鎵嶉噰鐢╲dso鏈哄埗錛堥棿鎺ヨ皟鐢╯yscall錛屽叿浣撳彲浠ュ弬鐪嬭祫鏂?錛夛紝鍏朵粬緋葷粺璋冪敤鐩存帴鐢ㄦ寚浠yscall錛屽師鍥犳槸錛?/p>
"蹇熺郴緇熻皟鐢ㄦ寚浠?姣旇搗涓柇鎸囦護鏉ヨ錛屽叾娑堣楁椂闂村繀鐒朵細灝戜竴浜涳紝浣嗘槸闅忕潃 CPU 璁捐鐨勫彂灞曪紝灝嗘潵搴旇涓嶄細鍐嶅嚭鐜扮被浼?Intel Pentium4 榪欐牱鎮畩鐨勫樊璺濄傝?蹇熺郴緇熻皟鐢ㄦ寚浠?姣旇搗涓柇鏂瑰紡鐨勭郴緇熻皟鐢ㄦ柟寮忥紝榪樺瓨鍦ㄤ竴瀹氬眬闄愶紝渚嬪鏃犳硶鍦ㄤ竴涓郴緇熻皟鐢ㄥ鐞嗚繃紼嬩腑鍐嶉氳繃"蹇熺郴緇熻皟鐢ㄦ寚浠?璋冪敤鍒殑緋葷粺璋冪敤銆傚洜姝わ紝騫朵笉涓瀹氭瘡涓郴緇熻皟鐢ㄩ兘闇瑕侀氳繃"蹇熺郴緇熻皟鐢ㄦ寚浠?鏉ュ疄鐜般傛瘮濡傦紝瀵逛簬澶嶆潅鐨勭郴緇熻皟鐢ㄤ緥濡?fork錛屼袱縐嶇郴緇熻皟鐢ㄦ柟寮忕殑鏃墮棿宸拰緋葷粺璋冪敤鏈韓榪愯娑堣楃殑鏃墮棿鏉ユ瘮錛屽彲浠ュ拷鐣ヤ笉璁★紝姝ゅ閲囧彇"蹇熺郴緇熻皟鐢ㄦ寚浠?鏂瑰紡娌℃湁浠涔堝繀瑕併傝岀湡姝e簲璇ヤ嬌鐢?蹇熺郴緇熻皟鐢ㄦ寚浠?鏂瑰紡鐨勶紝鏄偅浜涙湰韜繍琛屾椂闂村緢鐭紝瀵規椂闂寸簿紜ц姹傞珮鐨勭郴緇熻皟鐢紝渚嬪 getuid銆乬ettimeofday 絳夌瓑銆傚洜姝わ紝閲囧彇鐏墊椿鐨勬墜孌碉紝閽堝涓嶅悓鐨勭郴緇熻皟鐢ㄩ噰鍙栦笉鍚岀殑鏂瑰紡錛屾墠鑳藉緱鍒版渶浼樺寲鐨勬ц兘鍜屽疄鐜版渶瀹岀編鐨勫姛鑳姐?nbsp; ----寮曡嚜鍙傝冭祫鏂?
ps:鏂囦腑鐨勫唴鏍哥増鏈負2.6.36錛実libc鐗堟湰涓?.11
鍙傝冭祫鏂?
1. Linux 2.6 瀵規柊鍨?CPU 蹇熺郴緇熻皟鐢ㄧ殑鏀寔: http://www.ibm.com/developerworks/cn/linux/kernel/l-k26ncpu/index.html (榪欑瘒鎴戣寰楁渶濂?
2. System Calls 錛?http://www.win.tue.nl/~aeb/linux/lk/lk-4.html錛堥噷闈㈡湁紼嬪簭鍙互鐢ㄦ潵鎼滅儲vsyscall絳夌殑鍦板潃錛屽緢鐩存帴錛?/p>
3. What is linux-gate.so.1 錛?http://www.trilithium.com/johan/2005/08/linux-gate/
4. Intel鎵嬪唽錛岄噷闈㈡湁鍚勭璧勬枡錛屾墜鍐岃繕鏄緢閲嶈鐨勶紝涔熸槸鏈鍩烘湰鐨?/p>