日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C和汇编混合编程--------函数调用后ebp、esp值问题

發(fā)布時間:2023/12/1 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C和汇编混合编程--------函数调用后ebp、esp值问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

今天老師又給了一個程序,讓我們分析,記錄一下分析過程
程序:

#include "stdio.h" #include "string.h"char *shellcode="\x64\x65\x66\x67\x68\x69\x70\x71\x05\x10\x40\x00"; void fun1(int a, int b) {printf("fun1 run!para a=%d,b=%d\n",a,b);char aa[4]={0}; strcpy(aa,shellcode); } void fun2(int a) {printf("fun2 run! para a=%d\n",a);} void fun3(int a,int b,int c) {printf("fun3 run! para a=%d,b=%d,c=%d\n",a,b,c); } int main(int argc, char* argv[]) {printf("begin\n");fun1(1,2);printf("end\n");return 0; }

結(jié)果:

fun2函數(shù)執(zhí)行了,沒有輸出來end

首先我們來看看為什么fun2執(zhí)行了,將程序反匯編
當執(zhí)行完char aa[4]={0},我們發(fā)現(xiàn)0x0019fed0這個地址存放這個數(shù)據(jù),此時我們看一下0x0019fed4和0x0019fed8內(nèi)的數(shù)據(jù)

當執(zhí)行完strcpy時,0x0019fed0到0x0019fed8存放的內(nèi)容是shellcode的內(nèi)容,為什么是這個數(shù)據(jù),看這篇文章(https://blog.csdn.net/qq_41683305/article/details/104282462),繼續(xù)往下執(zhí)行

當執(zhí)行到ret命令時,我們觀察esp的值,發(fā)現(xiàn)存放的內(nèi)容是00401005,這個是什么?我們找到fun2的地址

發(fā)現(xiàn)和fun2的地址一樣,這就是為什么會執(zhí)行fun2

為什么不會輸出end呢?
下面繼續(xù)分析,按照上面的繼續(xù)執(zhí)行,當執(zhí)行到ret時,此時esp存放的數(shù)據(jù)是00000001,我們會到這個地址執(zhí)行

00000001啥都不是,所以不會執(zhí)行end

下面來解決問題
現(xiàn)在我們來理一理思路,程序先執(zhí)行fun1,然后去執(zhí)行fun2,然后到00000001執(zhí)行,沒有返回來,我們要注意,00000001是我們程序fun1(1,2)中的1,所以我們將1改成我們要fun2執(zhí)行完跳轉(zhuǎn)的地址,就可以繼續(xù)執(zhí)行了,這個地址就是下圖中的地址,跳轉(zhuǎn)到這里繼續(xù)執(zhí)行

我們來改一下,程序:

#include "stdio.h" #include "string.h"char *shellcode="\x64\x65\x66\x67\x68\x69\x70\x71\x05\x10\x40\x00"; void fun1(int a, int b) {printf("fun1 run!para a=%d,b=%d\n",a,b);char aa[4]={0}; strcpy(aa,shellcode); } void fun2(int a) {printf("fun2 run! para a=%d\n",a);} void fun3(int a,int b,int c) {printf("fun3 run! para a=%d,b=%d,c=%d\n",a,b,c); } int main(int argc, char* argv[]) {printf("begin\n");fun1(0x401191,2);printf("end\n");return 0; }


我們可以看到fun1里填的0x401191不是0x40118e,這是1和0x401191和所占的字節(jié)不同導致的

繼續(xù)報錯,提示堆棧沒有平衡,繼續(xù)分析
我們分析一下,當調(diào)用fun1函數(shù)前,esp的值如圖

fun2執(zhí)行完,執(zhí)行完下圖的add esp,8時,esp的值為


本應該執(zhí)行完add esp,8,esp的值應該是調(diào)用fun1函數(shù)前的值,結(jié)果差了4,找到原因了,補上:

#include "stdio.h" #include "string.h"char *shellcode="\x64\x65\x66\x67\x68\x69\x70\x71\x05\x10\x40\x00"; void fun1(int a, int b) {printf("fun1 run!para a=%d,b=%d\n",a,b);char aa[4]={0}; strcpy(aa,shellcode); } void fun2(int a) {printf("fun2 run! para a=%d\n",a);} void fun3(int a,int b,int c) {printf("fun3 run! para a=%d,b=%d,c=%d\n",a,b,c); } int main(int argc, char* argv[]) {printf("begin\n");fun1(0x401191,2);__asm{sub esp,4}printf("end\n");return 0; }


棧都平衡了,為什么還會報錯呢,這就和檢查有沒有平衡棧的機制有關了

ebp存放的是調(diào)用函數(shù)前的esp,函數(shù)調(diào)用最后需要平衡棧數(shù)據(jù),也就是將esp還原成調(diào)用函數(shù)前的esp,如果比較ebp和esp相等就不報錯

沒錯還和ebp有關,在執(zhí)行strcpy時,把原來的ebp內(nèi)容修改了,所以會報錯,繼續(xù)改,還原原來的ebp

#include "stdio.h" #include "string.h"char *shellcode="\x64\x65\x66\x67\x68\x69\x70\x71\x05\x10\x40\x00"; void fun1(int a, int b) {printf("fun1 run!para a=%d,b=%d\n",a,b);char aa[4]={0}; strcpy(aa,shellcode); } void fun2(int a) {printf("fun2 run! para a=%d\n",a);} void fun3(int a,int b,int c) {printf("fun3 run! para a=%d,b=%d,c=%d\n",a,b,c); } int main(int argc, char* argv[]) {printf("begin\n");fun1(0x401191,2);__asm{sub esp,4mov ebp,0x19ff30}printf("end\n");return 0; }

執(zhí)行,完美解決問題

總結(jié):

  • 檢查棧有沒有平衡,是根據(jù)ebp和esp的值,有一個修改都要還原
  • ebp存放的是調(diào)用函數(shù)前的esp,函數(shù)調(diào)用最后需要平衡棧數(shù)據(jù),也就是將esp還原成調(diào)用函數(shù)前的esp,如果比較ebp和esp相等就不報錯,就是下圖這兩條語句檢查的
  • esp和ebp的值最后要相同

中間涉及esp和ebp的值變換,沒有寫了,反匯編調(diào)試注意一下

總結(jié)

以上是生活随笔為你收集整理的C和汇编混合编程--------函数调用后ebp、esp值问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 色爽爽一区二区三区 | 强videoshd酒醉 | 黄色喷水视频 | 亚洲av人无码激艳猛片服务器 | 少妇高潮一区二区三区99 | 操极品 | 日本三级片在线观看 | 日韩成人av电影 | 自偷自拍亚洲 | 久久综合激情网 | 欧美一区二区三区黄色 | 男女爽爽 | 日韩在线免费看 | 国产精品一区在线观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 华人永久免费视频 | 看av网址 | 91资源站| 黑丝av在线 | 亚洲男性天堂 | 中文字幕高清在线观看 | 黄色美女视频网站 | 国产无遮挡免费 | 国产区在线 | 永久免费国产 | 欧亚在线视频 | 国产精品伦子伦免费视频 | 日韩欧美成人一区二区 | 雨宫琴音一区二区三区 | 国产精品yy | 国产肉体ⅹxxx137大胆 | 一级黄色a| 久久亚洲伊人 | 天天操夜夜爱 | 波多野吉衣一二三区乱码 | 在线观看亚洲一区 | 激情亚洲视频 | 亚洲国产精品久久 | 超碰男人的天堂 | 国产成人免费看 | 九九九九色 | 久久香蕉精品 | 国产精品夜夜夜爽张柏芝 | 69xxx少妇按摩视频 | 亚洲女同一区二区 | 欧美视频网址 | 在线视频午夜 | 依依综合网 | 四虎成人网 | 午夜视频在线观看视频 | 欧美黄色大片视频 | 欧美老女人性视频 | 在线观看日本一区二区 | 香蕉久久av一区二区三区 | 亚洲一区二区在线视频 | 视频这里只有精品 | 国产乱码久久久 | 亚洲精品视频91 | 少妇人妻在线视频 | 婷婷激情视频 | 在线观看国产黄色 | 女人性高潮视频 | 女同久久另类69精品国产 | 国产精品18p| 国产又粗又猛又大爽 | 亚洲无在线观看 | 欧美日韩一区二区三区在线视频 | 在线欧美亚洲 | 亚洲夜色| 久久艹这里只有精品 | 成人精品免费在线观看 | 4虎最新网址 | 性久久久久久久久久久 | 福利在线视频观看 | 国产夫绿帽单男3p精品视频 | 毛片国产精品 | 欧美日韩成人一区 | 亚洲女同av | 天堂av2019 | 天天免费看av | 超碰1997| 亚洲av鲁丝一区二区三区 | 超碰超碰在线 | 日韩视频免费看 | 人妻色综合网站 | 直接看av的网站 | 亚洲国产综合久久 | 三级视频久久 | 天天影视插插插 | 美日韩久久| 日本黄xxxxxxxxx100 | 91精品在线视频观看 | 天天看片天天射 | 肥臀浪妇太爽了快点再快点 | 香蕉久久久久久 | 中国在线观看片免费 | 奶水喷溅 在线播放 | 91刺激视频| 在线不卡毛片 |