10-调用门(有参)实验
生活随笔
收集整理的這篇文章主要介紹了
10-调用门(有参)实验
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上一篇重點講解了沒有參數的調用門實驗,本節講解有參數的調用門實驗。
1. 編寫R0函數
int g_a, g_b, g_c; __declspec(naked) void getParam(int a, int b, int c) {__asm {// int 3 // 取消注釋可以在WinDbg中看R0棧數據pushad // 0x20 Bpushfd // 0x04 B// .- 8 個通用寄存器和標志寄存器占用大小// | .- cs 和 eip 占用大小// | |mov eax, [esp+0x24+0x08+0x08] // 參數 amov g_a, eaxmov eax, [esp+0x24+0x08+0x04] // 參數 bmov g_b, eaxmov eax, [esp+0x24+0x08+0x00] // 參數 cmov g_c, eaxpopfdpopadretf 0x0c} } int main(int argc, char* argv[]) {// 構造cs:eipchar cs_eip[6] = {0, 0, 0, 0, 0x48, 0};__asm {push 1push 2push 3call fword ptr [cs_eip];}printf("g_a = %d\ng_b = %d\ng_c = %d\n", g_a, g_b, g_c);return 0; }2. 記錄getParam函數地址
可以看到地址為 0x00401020
3. 構造帶3個參數的調用門描述符
調用門描述符結構:| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 字節 |76543210|76543210|7 65 4 3210|765 43210|76543210|76543210|76543210|76543210| 比特 |-----------------|1|--|0|1100|000|-----|--------|--------|--------|--------| 占位 |offset in segment|P|D |S|TYPE| |param|segment selector |offset in segment| 含義 | 31-16 |P | |nums | | 15-0 ||L |注意有些比特位是固定的。根據調用門描述符結構,可以構造出描述符 0040ec03`00081020,然后安裝到gdt表的8003f048的位置。
4. 執行結果
5. 查看R0棧數據
這里需要取消 int 3那行注釋,這樣會在 WinDbg 下中斷??梢钥吹紺S/SS都已經是R0的段了,esp也指向了高2G的地址。(為什么會這樣?CPU需要始終保持 cs 中的 CPL 和 ss 中的 CPL 一致)
可以看到這時候 esp 的值為 0xb2391dc4,去看一下棧內存數據
6. 總結
當使用調用門進行提權的時候,程序由3環進入0環,這時候需要切換棧,也就是說要更改 ss 段選擇子和 esp 的值。這時候 CPU 會自動的幫我們把原始 3 環的 ss, esp, 參數(如果有的話), cs 和 eip 復制到這個 0 環棧中去。
一定要注意,這是 CPU 自動幫我們做的事情,和 OS 沒有任何關系。
引起注意的地方是,切換棧,需要 0 環 ss 段選擇子和 esp ,這些值 CPU 是如何找到了呢?這個問題先放在這兒,后續文章解決會揭曉答案。這里,只給出一個線索——TSS.
總結
以上是生活随笔為你收集整理的10-调用门(有参)实验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MTK6577+Android编译之an
- 下一篇: 什么是数据蔓延?