您现在的位置是:Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款 >
04 訂閱鏈接轉換ss(CPU和CPUID是什么關系?)
Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款2024-07-18 05:38:29【】1人已围观
简介n1(SYSV),forGNU/Linux2.2.5,dynamicallylinked(usessharedlibs),notstripped[root@test]#ldddynamiclinux-
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,具體代碼這里就不再贅述。
由此可見,無論是靜態還是動態方式,最終我們都
很赞哦!(997)
相关文章
- 02 我國海外軍事保障基地(中國在國外有一后勤基地,每年2000萬美元,這個后勤基地在哪里呢?)
- #國內tiktok怎么注冊(百度知道) 01
- 02 我國對外貿易的優勢和劣勢(我國中小企業國際貿易的swot分析)
- 02 我國服務貿易發展現狀(我國服務貿易的發展現狀)
- #可以打開tiktok的免費買粉絲(百度知道「知道團隊」下線通知!) 01
- 02 我國服務貿易發展現狀、問題及對策研究(我國服務貿易現狀及發展對策)
- #國際抖音tiktok怎么樣才能看(電腦版的百度首頁的買粉絲是什么?) 01
- 02 我國農產品國際貿易現狀和對策分析(我國綠色食品出口貿易現狀問題和對策)
- 02 我國國際服裝貿易的現狀(分析中國當前的貿易條件及改進措施)
- 02 我國服務貿易發展現狀和發展策略分析論文(中國旅游服務業國際化的態勢及對策探析 急!)
热门文章
站长推荐
02 我國的自由貿易試驗區改革制度(如何認識自由貿易試驗區制度創新)
#為什么拔卡也看不了tiktok(百度知道「知道團隊」下線通知!) 01
#國外版抖音tiktok怎么注冊不了(百度知道「知道團隊」下線通知!) 01
02 我國農產品國際貿易現狀的對策(加入WTO后,對我國農產品國際貿易的影響與對策)
02 我國海外安保力量建設現狀(如何應對"一帶一路"面臨的挑戰)
02 我國對于制定、調整和公布國際服務貿易(全國近幾年高等教育自學考試國際經濟法概論試題和答案)
02 我國播放量最高的電視劇(那些播放量破百億的電視劇,你看過幾部?)
02 我國外貿進出口總值首次突破(我國外貿進出口首次突破6萬億美元大關,外貿進出口呈現了哪些特點?)