# 來拆一拆__libc_start_main ###### tags: `Reverse` 1. 從entry point(start)開始 - start ![](https://i.imgur.com/ckFQKnp.png) :::info 1. 在剛開始執行時,會把參數以倒序+argc push到stack上 ex. gdb> r aaa 會依序push aaa, binary_path, 0x2(2個arg) (0x4009d0是entry pt) ![](https://i.imgur.com/GMxjXvf.png) 因此第三行的pop rsi就相當於把stack頂的argc pop給rsi 第四行的mov rdx, rsp相當於把binary_path傳給rdx 第五行對rsp & 0xFF...F0是為了要確保stack是0x10對齊 ::: 2. __libc_start_main ```c= int __libc_start_main(int (*main) (int, char **, char **), int argc, char ** ubp_av, void (*init) (void), void (*fini) (void), void (*rtld_fini) (void), void (*stack_end)); ``` :::info 參數有7個+1個多餘的,分別為 ![](https://i.imgur.com/rUkUJv9.png =1000x250) Note: 如果是x86,直接用stack傳所有參數(也要多一個唷) Note: 無論是x86或x64,都要從**最後一個**參數開始處理 ::: call __libc_start_main時的狀況 ![](https://i.imgur.com/dY8RW0B.png)