目錄
C++逆向 可變參數Hook
0x00 前言:
我們在做逆向分析的時候,經常會需要去Hook一個程序的日志輸出函數。
而這種日志輸出函數一般參數都不確定,這就會引起一個問題。我們如何知道參數個數?如何知道他有哪些參數呢?
0x01 C++可變參數:
可變參數簡介
在C++中,可變參數的函數定義可以寫成如下格式。用...
來聲明可變參數。
void test(int a,int b,...)
{
//Code...
}
在調用可變參數的函數時,可以在后面不斷添加參數,例如。
test(1,2,3,4,5,"hello","test",6);
可變參數代碼實戰
那么回歸正題,test函數里如何知道它傳進來的后面所有參數個數呢?
這就需要用到stdarg.h
頭文件中的幾個關鍵字了va_list
、va_start
、va_end
。
#include <stdio.h>
#include <stdarg.h>
void test(int a,int b,...)
{
va_list arg_ptr;//定義可變參數指針
va_start(arg_ptr,b); //b為最后一個固定參數
printf("Address = %p",arg_ptr);//將arg_ptr的地址進行輸出。
va_end(arg_ptr); //清空可變參數指針
}
int main(int argc,char *argv[])
{
test(1,2,3,4,5,"hello","test,6");
}
- 首先va_list定義了一個可變參數的指針。
- va_start函數傳入,可變參數指針和最后一個固定參數,傳出引用可變參數指針。
- 輸出可變參數指針地址。
- 清空可變參數指針內存空間。
0x02 逆向分析C++可變參數原理
將上面的代碼用VC6編譯出來后進行調試分析。
找到特征。
在匯編代碼中,定位到main函數。
接着在匯編處call va_arg.401005
處下一個斷點。可以看到他將參數一個個push到了堆棧中。
接着按F7
跟入test
函數。
通過對匯編代碼的分析,我大概知道了va_start函數()
為什么要將最后一個固定參數傳入。因為他需要用最后一個固定參數在堆棧中進行偏移的計算,計算出可變參數的地址。
遍歷該堆棧,當遍歷到的值是入口點,說明可變參數已經遍歷完成。
0x03 printf Hook實戰
這里我隨便選了一個系統的可變參數函數,printf
可以將格式化后的字符串進行輸出,符合我們可變參數函數的要求。
Pwn菜雞學習小分隊
歡迎加入探討 逆向知識和PWN