iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 21
1
Security

逆向工程 – 從入門到放棄系列 第 21

Day21 - 逆向並找出函式呼叫的特徵

因為是函式呼叫所以能觀察到 main() 裡面去 call 其他 function 。今天介紹呼叫單一函數、函數裡僅有單一參數、雙參數、函數中再呼叫其他函數的情況。

呼叫單一函數

disassemble main

可以看到 main 裡 call 一個 function。

disassemble function

這裡要說一下 function prologue。包括:push rbp、mov rbp, rsp (因為此 function 沒有 local variable,不然的話應該會有 sub rsp, xxx 的 function prologue)。而 function epilogue 則是 pop rbp、ret。

解答公布:

#include <stdio.h>

void function();
int main(void) {
  function();
  return 0;
}
void function() { printf("Hello, world!\n"); }

單一參數

disassemble main

可以看到 main 裡 call 一個 function 叫 theSquareFunction。並且把 0xA 存到 edi。

disassemble function

這裡的 function prologue 因為有 local variable,所以才有 sub rsp, 20h 的 function prologue。另外可以看到 imul eax, eax 是用來自己相乘(平方),而 eax 來自 edi (即成功取得外部傳來的參數)。

解答公布:

#include<stdio.h>

void theSquareFunction(int side);
int main(void){
    theSquareFunction(10);
    return 0;
}

void theSquareFunction(int side){
    int area = side * side;
    printf("The area is %d\n", area);
}

雙參數

disassemble main

disassemble function

IDA Pro 突然開不起來......換成Hopper Disassembler。可以看到下圖,透過 esi 與 edi 將兩個參數傳入並做運算。

解答公布:

#include<stdio.h>

void theSquareFunction(int side1, int side2);
int main(void){
  theSquareFunction(10, 11);
  return 0;
}

void theSquareFunction(int side1, int side2) {
  int area = side1 * side2;
  printf("The area is %d\n", area);
}

函數中再呼叫其他函數

disassemble main()

main() 呼叫 function1。

disassemble function1()

function1 先加一,再呼叫 function2。

disassemble function2()

function2 加一,從 0x1f 變成 0x20。最後再呼叫 0x1050 做 printf()。

解答公布:

#include<stdio.h>

void function1();
void function2();
int main(void){
    function1();
    return 0;
}

void function1(){
  int num1 = 15;
  num1++;
  printf("Num1 from function1 is %d\n", num1);
  function2();
}

void function2(){
  int num2 = 31;
  num2++;
  printf("Num2 from function2 is %d\n", num2);
}

Reference

結論

今天講解函式呼叫。明天講解陣列的特徵。


上一篇
Day20 - 逆向並找出循環的特徵
下一篇
Day22 - 逆向並找出陣列的特徵
系列文
逆向工程 – 從入門到放棄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言