作者:申小寧 原創作品轉載請註明出處
《Linux內核分析》MOOC課程 http://mooc.study.163.com/course/USTC-1000029000
實驗截圖:
c代碼:
編譯命令:
彙編代碼:
基礎知識
寄存器
寄存器是中央處理器內的組成部分。寄存器是有限存貯容量的高速存貯部件,它們可用來暫存指令,數據和地址。
eip:存儲當前指令寄存器,每執行完一條指令,eip將指向下一條指令。
ebp:是"基址指針"(BASE POINTER), 它最經常被用作高級語言函數調用的"框架指針"(frame pointer). 在破解的時候,經常可以看見一個標準的函數起始代碼:
esp:專門用作堆棧指針,被形象地稱爲棧頂指針,堆棧的頂部是地址小的區域,壓入堆棧的數據越多,ESP也就越來越小。在32位平臺上,ESP每次減少4字節。
eax:是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器。
尋址方式
寄存器尋址 movl %eax,%ebx 把eax的值,賦給ebx
立即尋址 movl $0x1234,%eax 把0x1234這個立即數,賦值給eax。
直接尋址 movl 0x12345,%eax 把0x12345這個內存地址存放的數據賦值給eax。
間接尋址 movl (%eax),%ebx eax上存放的一個內存地址,這個內存地址存放的值,賦值給ebx。
變址尋址 movl 8(%eax),%ebx eax上存放的值,加上偏移量8 後,所指向的位置存放的內存地址,這個內存地址存放的值,賦值給ebx
從main函數入手:
第一句:pushl %ebp
Pushl %ebp(表示把eax寄存器的內容壓倒棧頂):
等價於:
subl $4,%esp (堆棧的棧頂)
movl %ebp,(%esp)
第二句:movl %esp, %ebp
使得ebp指向esp指向的位置。
第三句:subl $4, %esp
棧頂向下偏移4個字節。
第四句:movl $99, (%esp)
將一個立即99存入棧頂。
第五句:call f 即調用函數f()
call 指令可分解成
pushl eip
movl f eip
f函數
pushl %ebp (存儲EBP位置,壓棧,esp加一)
movl %esp %ebp (esp 指向EBP)
...
movl %eax (%esp)
把esp存儲內存地址 指向 eax寄存器
call g執行函數g
g函數
ret 函數返回作用 返回執行gax內的指令。
總結:彙編語言是計算機語言的基礎,想要深入理解linux內核或者學習一些其他語言,彙編都是基礎,小夥伴們加油了!!!