您现在的位置是:Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款 > 

04 訂閱鏈接轉換ss(CPU和CPUID是什么關系?)

Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款2024-05-03 02:50:51【】9人已围观

简介n1(SYSV),forGNU/Linux2.2.5,dynamicallylinked(usessharedlibs),notstripped[root@test]#ldddynamiclinux-

n 1 (SYSV),

for GNU/Linux 2.2.5, dynamically linked (uses shared libs), not stripped

[root@test]# ldd dynamic

linux-gate.so.1 => (0xffffe000)

libc.so.6 => /lib/tls/libc.so.6 (0x4002c000)

/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

這個所謂的"linux-gate.so.1"的內容就是內核映射的代碼,系統中其實并不存在這樣一個鏈接庫文件,它的名字是由ldd自己起的,而在老版本的ldd中,雖然能夠檢測到這段代碼,但是由于沒有命名而且在系統中找不到對應鏈接庫文件,所以會有一些顯示上的問題。有關這個問題的背景,可以參考下面這個買粉絲: 買粉絲://sources.redhat.買粉絲/ml/libc-alpha/2003-09/msg00263.買粉絲。

由用戶態經庫函數進入內核態

為了配合內核使用新的系統調用方式,glibc中要做一定的修改。新的glibc-2.3.2(及其以后版本中)中已經包含了這個改動,在glibc源代碼的sysdeps/unix/sysv/linux/i386/sysdep.h文件中,處理系統調用的宏INTERNAL_SYSCALL在不同的編譯選項下有不同的結果。在打開支持sysenter/sysexit指令的選項I386_USE_SYSENTER下,系統調用會有兩種方式,在靜態鏈接(編譯時加上-static選項)情況下,采用"call *_dl_sysinfo"指令;在動態鏈接情況下,采用"call *%gs:0x10"指令。這兩種情況由glibc庫采用哪種方法鏈接,實際上最終都相當于調用某個固定地址的代碼。下面我們通過一個小小的程序,配合 gdb來驗證。

首先是一個靜態編譯的程序,代碼很簡單:

main()

{

getuid();

}

將代碼加上static選項用gcc靜態編譯,然后用gdb裝載并反編譯main函數。

[root@test opt]# gcc test.c -o ./static -static

[root@test opt]# gdb ./static

(gdb) disassemble main

0x08048204 <main+0>: push %ebp

0x08048205 <main+1>: mov %esp,%ebp

0x08048207 <main+3>: sub $0x8,%esp

0x0804820a <main+6>: and $0xfffffff0,%esp

0x0804820d <main+9>: mov $0x0,%eax

0x08048212 <main+14>: sub %eax,%esp

0x08048214 <main+16>: call 0x804cb20 <__getuid>

0x08048219 <main+21>: leave

0x0804821a <main+22>: ret

可以看出,main函數中調用了__getuid函數,接著反編譯__getuid函數。

(gdb) disassemble 0x804cb20

0x0804cb20 <__getuid+0>: push %ebp

0x0804cb21 <__getuid+1>: mov 0x80aa028,%eax

0x0804cb26 <__getuid+6>: mov %esp,%ebp

0x0804cb28 <__getuid+8>: test %eax,%eax

0x0804cb2a <__getuid+10>: jle 0x804cb40 <__getuid+32>

0x0804cb2c <__getuid+12>: mov $0x18,%eax

0x0804cb31 <__getuid+17>: call *0x80aa054

0x0804cb37 <__getuid+23>: pop %ebp

0x0804cb38 <__getuid+24>: ret

上面只是__getuid函數的一部分。可以看到__getuid將eax寄存器賦值為getuid系統調用的功能號0x18然后調用了另一個函數,這個函數的入口在哪里呢?接著查看位于地址0x80aa054的值。

(gdb) X 0x80aa054

0x80aa054 <_dl_sysinfo>: 0x0804d7f6

看起來不像是指向內核映射頁面內的代碼,但是,可以確認,__dl_sysinfo指針的指向的地址就是0x80aa054。下面,我們試著啟動這個程序,然后停在程序第一條語句,再查看這個地方的值。

(gdb) b main

Breakpoint 1 at 0x804820a

(gdb) r

Starting program: /opt/static

Breakpoint 1, 0x0804820a in main ()

(gdb) X 0x80aa054

0x80aa054 <_dl_sysinfo>: 0xffffe400

可以看到,_dl_sysinfo指針指向的數值已經發生了變化,指向了0xffffe400,如果我們繼續運行程序,__getuid函數將會調用地址0xffffe400處的代碼。

接下來,我們將上面的代碼編譯成動態鏈接的方式,即默認方式,用gdb裝載并反編譯main函數

[root@test opt]# gcc test.c -o ./dynamic

[root@test opt]# gdb ./dynamic

(gdb) disassemble main

0x08048204 <main+0>: push %ebp

0x08048205 <main+1>: mov %esp,%ebp

0x08048207 <main+3>: sub $0x8,%esp

0x0804820a <main+6>: and $0xfffffff0,%esp

0x0804820d <main+9>: mov $0x0,%eax

0x08048212 <main+14>: sub %eax,%esp

0x08048214 <main+16>: call 0x8048288

0x08048219 <main+21>: leave

0x0804821a <main+22>: ret

由于libc庫是在程序初始化時才被裝載,所以我們先啟動程序,并停在main第一條語句,然后反匯編getuid庫函數

(gdb) b main

Breakpoint 1 at 0x804820a

(gdb) r

Starting program: /opt/dynamic

Breakpoint 1, 0x0804820a in main ()

(gdb) disassemble getuid

Dump of assembler 買粉絲de for function getuid:

0x40219e50 <__getuid+0>: push %ebp

0x40219e51 <__getuid+1>: mov %esp,%ebp

0x40219e53 <__getuid+3>: push %ebx

0x40219e54 <__getuid+4>: call 0x40219e59 <__getuid+9>

0x40219e59 <__getuid+9>: pop %ebx

0x40219e5a <__getuid+10>: add $0x84b0f,%ebx

0x40219e60 <__getuid+16>: mov 0xffffd87c(%ebx),%eax

0x40219e66 <__getuid+22>: test %eax,%eax

0x40219e68 <__getuid+24>: jle 0x40219e80 <__getuid+48>

0x40219e6a <__getuid+26>: mov $0x18,%eax

0x40219e6f <__getuid+31>: call *%gs:0x10

0x40219e76 <__getuid+38>: pop %ebx

0x40219e77 <__getuid+39>: pop %ebp

0x40219e78 <__getuid+40>: ret

可以看出,庫函數getuid將eax寄存器設置為getuid系統調用的調用號0x18,然后調用%gs:0x10所指向的函數。在gdb中,無法查看非DS段的數據內容,所以無法查看%gs:0x10所保存的實際數值,不過我們可以通過編程的辦法,內嵌匯編將%gs:0x10的值賦予某個局部變量來得到這個數值,而這個數值也是0xffffe400,具體代碼這里就不再贅述。

由此可見,無論是靜態還是動態方式,最終我們都

很赞哦!(8)

Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款的名片

职业:程序员,设计师

现居:湖南邵阳邵东县

工作室:小组

Email:[email protected]