最近在看一個關于后臺開發的相關書籍,書籍前面的內容是回顧 C++ 的基礎,再跟著復習一下,本身基礎就不是特別的好。
寫 C++ 的過程中,順便使用 ht 來看兩眼反匯編代碼,其實對于 macOS 下的逆向不是特別了解,但是多少有一點關于 Windows 下的基礎。
逆向的代碼比較簡單的,是一個函數重載的例子,其實是書上的例子代碼,代碼如下:
int min(int a, int b, int c)
{
if (a > b) a = b;
if (a > c) a = c;
return a;
}
long long min(long long a, long long b, long long c)
{
if (a > b) a = b;
if (a > c) a = c;
return a;
}
double min(double a, double b)
{
if (a - b > (1e-5)) a = b;
return a;
}
代碼并不復雜,就是函數重載,使用 ht 進行一下反匯編,查看一下其反匯編代碼,代碼如下:
100000b10 ! │
│ ......... ! ;******************************************************** │
│ ......... ! ; function min(int, int, int) │
│ ......... ! ;******************************************************** │
│ ......... ! __Z3miniii: ;xref c100000c0d │
100000b50 ! │
│ ......... ! ;******************************************************** │
│ ......... ! ; function min(long long, long long, long long) │
│ ......... ! ;******************************************************** │
│ ......... ! __Z3minxxx: ;xref c100000c57 │
│ ......... ! 55 push rbp
100000ba0 ! │
│ ......... ! ;******************************************************** │
│ ......... ! ; function min(double, double) │
│ ......... ! ;******************************************************** │
│ ......... ! __Z3mindd: ;xref c100000ca2 │
│ ......... ! 55 push rbp
通過截取的代碼可以看出,ht 識別出了三個 min 函數,并且聲稱了相應的注釋。
比如:
__Z3miniii 這部分可以看出,函數名稱為 min ,三個參數分別是 i i i,也就是 3 個 int 類型。
除此之外,macOS 的參數傳遞竟然使用的寄存器,對它的調用約定不是了解。有機會找找資料了解一下。代碼如下:
100000c2f ! mov qword ptr [rbp-18h], 64h │
│ 100000c37 ! mov qword ptr [rbp-20h], 0c8h │
│ 100000c3f ! mov qword ptr [rbp-28h], 12ch │
│ 100000c47 ! mov rdi, [rbp-18h] │
│ 100000c4b ! mov rsi, [rbp-20h] │
│ 100000c4f ! mov rdx, [rbp-28h] │
│ 100000c53 ! mov [rbp-40h], rax │
│ 100000c57 ! call __Z3minxxx
可以看出,調用 long long 類型的 min 函數時,傳參使用了 rdi、rsi、rdx 三個寄存器,對于調用 double 類型的 min 函數時使用的寄存器又不相同,反匯編代碼如下:
│ 100000c7a ! movsd xmm0, [data_100000f60] │
│ 100000c82 ! movsd xmm1, [data_100000f68] │
│ 100000c8a ! movsd [rbp-30h], xmm1 │
│ 100000c8f ! movsd [rbp-38h], xmm0 │
│ 100000c94 ! movsd xmm0, [rbp-30h] │
│ 100000c99 ! movsd xmm1, [rbp-38h] │
│ 100000c9e ! mov [rbp-48h], rax │
│ 100000ca2 ! call __Z3mindd
可以看到,這里使用了 xmm0 和 xmm1 兩個寄存器。
對 macOS 的逆向分析不熟悉,逆向在一邊寫代碼一邊看反匯編代碼也可以逐步的提升。當然,要是能系統的了解了解就更好了。