青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

jans2002的博客

專注 專心 專業

(轉)一個小技巧:SFP Overwrite(以c語言為實例)


SFP Overwrite
I'd like a share a little trick I figured out today. I'm sure it has been done before and probably many times but its new to me so I'll describe it here. I asked myself if anything cool could be achieved by overwriting the Saved Frame Pointer instead of the Return Address. I'm not sure what sort of security-related attacks could be leveraged by doing this, but I did find that its possible to affect the program flow in the calling function. This is just another trick to change the flow of execution and even works on a non-executable stack.
The vulnerable program source code
The attack program source code
EBP and Local Variables
The extended base pointer is a register used by the CPU as base for the current stack frame. As we discussed earlier, the EBP for the function that called the current one is stored in the current function's Saved Frame Pointer. The EBP points to this SFP; in this way, there is a chain of saved EBPs for each stack frame. Check out the EIP Redirection page for more details about this. The location of the current stack frame's SFP is stored in the Extended Base Pointer.名稱:  sfptut3.jpg
查看次數: 22
文件大小:  11.3 KB
Keeping track of the chain of the program's stack frames is not the only purpose of the EBP/SFPs. As the name implies, the Extended Base Pointer register holds an address that is used as the "base" of the current stack frame (this address is the frame's SFP). The code in the current function references local variables using EBP as a base. For example, the C code for setting a variable equal to 3 is myVar = 3;. This might be assembled into something like: MOV SS:[EBP - 4], 0x03. This means that the local variable myVar is referred to as "the address on the stack stored in EBP, minus 4 bytes" by the assembled code. Another variable in the same function called myVar2 might be located at SS:[EBP - 8]. We can see that if an attacker could change the value of EBP, they could also change where the code thinks local variables are.
Using SFP to Modify EBP
名稱:  sfptut1.jpg
查看次數: 23
文件大小:  14.8 KB
Imagine that there is function called FunctionA that is not vulnerable to any sort of buffer overflow. Inside it is a local integer variable that is used by the function later on. Before the variable is used, another function called FunctionB is called. This one happens to be vulnerable to a buffer overflow. Our goal is to trick FunctionA into using a variable that we define instead of the one that it declared.
We wait until the execution reaches FunctionB and we are able to input our malicious buffer. At the beginning we'll have the value of the fake variable that FunctionA will be tricked into using. From there, we pad the buffer with junk until the saved frame pointer is reached. Now we push the address on the stack that is directly below our fake variable. The reason we do this is that FunctionA references its real variable as SS:[ebp - 4]. Therefore, our injected EBP must be 4 bytes beyond our fake variable. By setting it up in this way, if we can manage to get that address into the Extended Base Pointer while FunctionA is executing; our fake variable will be referenced instead of the real one. We are not overwriting the value in the real variable. Instead, we are changing FunctionA's perception of its location to an address inside the buffer that we control.
The Target
Now its time to put our attack into a context. At the top of the source code, you'll notice the vulnerable test() function. All it does is declare a 5 byte buffer and fail to protect it while its being filled with user input. The main() function declares a local integer variable (4 bytes) and feeds the decimal value 3 into it. Main() then calls the test() function which asks the user for input but doesn't do anything with it. After test() returns, a loop is entered. The loop keeping looping as long as the integer c is greater than zero. Each time it repeats, the value of c is decreased by one and "Later" is displayed on the screen. Overall, this thing prints that word c times. Because the value of this integer was set to 3 earlier, this means that "Later" is printed 3 times by this loop. 名稱:  sfptut2.jpg
查看次數: 21
文件大小:  10.9 KB
We will trick this program into thinking that a variable we create using the vulnerable buffer is actually c. By filling this fake variable with the decimal value 500,000,001, we'll make this loop run and print "Later" 500 million and one times instead of the expected three.
Buiding the Attack
As before, we'll be writing a program in C that will feed a malicious string into the input of the vulnerable program. Because our ultimate goal is to overwrite the test() function's SFP, we'll need to pad the string appropriately to get there. The first 4 bytes of the attack string will be the value of our fake variable that main() will eventually use in its loop. These bytes need to equal the goal of 500,000,001 so we'll feed "\x01\x65\xCD\x1D" first. The next four do not matter in this case, but take note that they will become main()'s fake SFP. From here use OllyDbg to find the distance between this fake main() SFP and test()'s SFP. If you are unsure where the test() function's SFP is, you can always step the program until inside test() and check the EBP register. You'll find that the buffer begins at 0x0027FF00 and the test() function's SFP is located at 0x0027FF18. After converting to decimal and subtracting the 8 bytes we already used up so far, it means we'll need to add 16 bytes of padding to reach test()'s SFP.
名稱:  sfptut4.jpg
查看次數: 21
文件大小:  11.1 KB
Next we'll actually overwrite the SFP. Have a look at the main() function and you'll find that the loop references the variable c as SS:[EBP - 4]. This means that if we want it to reference that 4 byte value at the beginning of the buffer instead, we need main()'s EBP to point to the address 4 bytes beyond the beginning of our attack buffer. We've already pointed out that any value we can sneak into test()'s SFP will end up in the EBP when main() returns. So we end the attack string with the following 3 bytes: "\x04\xFF\x27". The value is chosen because 0x0027FF04 - 4 is the address of our fake variable. Writing all four bytes is, again, not necessary because gets() automatically sticks a null byte at the end of the string inputted.
Final Overview
By crafting the above buffer and ensuring that the last 3 bytes overwrite test()'s SFP, we directly control EBP when test() returns back to main(). Because main() uses EBP to reference an important variable c and we control EBP; we make main() think that c is actually where our old overwritten buffer began. The data is still there because there was no reason for the program to erase/modify it. Because c is referenced as SS:[EBP - 4] in main(), we need that overwritten Stack Frame Pointer to point to the address four bytes below the fake variable location on the stack. When main uses our fake EBP to reference variable c is it will subtract 4 from it and find our fake variable value. This was filled in with the decimal value of 500,000,001. Main() runs the loop to print "Later" a number of times determined by c. So by doing all of this trickery we can make the program display "Later" 500,000,001 times instead of 3.

posted on 2009-09-29 09:09 jans2002 閱讀(386) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧洲日产国产网站| 亚洲永久免费精品| 久久久综合免费视频| 欧美在线短视频| 尤物yw午夜国产精品视频| 久久婷婷影院| 美女视频一区免费观看| 亚洲国产一区在线| 亚洲区在线播放| 欧美色视频一区| 香蕉久久精品日日躁夜夜躁| 亚洲一区免费网站| 国产综合在线看| 亚洲福利在线观看| 欧美特黄一级| 久久精品视频免费播放| 久久久精品五月天| 日韩午夜精品视频| 亚洲午夜精品视频| 亚洲电影一级黄| 一本色道久久综合亚洲二区三区| 国产精品免费网站在线观看| 久久久7777| 欧美精品啪啪| 久久国产手机看片| 欧美国产精品v| 久久黄色级2电影| 欧美成人激情在线| 欧美一区2区三区4区公司二百| 久久国产精彩视频| 一本久久综合亚洲鲁鲁| 午夜精品久久久久| 日韩一区二区免费高清| 午夜精品久久一牛影视| 亚洲免费观看高清完整版在线观看| 一区二区三区日韩精品视频| 狠狠色综合网站久久久久久久| 91久久久久久| 在线观看亚洲精品视频| 亚洲视频网在线直播| 亚洲国产精品专区久久| 亚洲一区三区电影在线观看| 亚洲全部视频| 久久激情视频免费观看| 亚洲欧美网站| 欧美日韩高清一区| 亚洲第一色在线| 激情小说亚洲一区| 欧美一区二区日韩| 亚洲欧美日韩精品久久| 欧美精品日韩三级| 欧美91大片| 一区二区三区在线视频播放| 在线综合亚洲| 亚洲一区综合| 欧美精品一区视频| 欧美激情第六页| 在线日韩av片| 久久精品二区| 久久精品国产99国产精品澳门| 欧美日韩亚洲视频一区| 亚洲黄色在线观看| 亚洲激情女人| 欧美激情小视频| 亚洲国产高清在线| 亚洲精品一区二区三区不| 久久人人97超碰精品888| 久久久久高清| 精品成人乱色一区二区| 久久精品99国产精品| 久久露脸国产精品| 樱桃视频在线观看一区| 久久久久久尹人网香蕉| 美女免费视频一区| 亚洲片区在线| 欧美激情视频一区二区三区免费| 亚洲成在人线av| 亚洲免费不卡| 欧美三级视频在线观看| 亚洲一级网站| 久久久www成人免费精品| 黑人一区二区| 欧美成人中文| 日韩视频免费| 欧美在线看片| 黄色另类av| 欧美电影在线观看| 宅男噜噜噜66一区二区66| 亚洲欧美日韩一区二区三区在线观看 | 欧美日韩在线观看一区二区| 日韩视频一区二区| 欧美有码视频| 亚洲丁香婷深爱综合| 欧美人与禽猛交乱配| 亚洲欧美国产精品va在线观看| 久久久久国产精品一区| 亚洲国内在线| 国产精品久久久久久久久久尿| 午夜精彩国产免费不卡不顿大片| 久久久视频精品| 日韩午夜av| 国产欧美日韩视频一区二区三区| 久久精品国内一区二区三区| 亚洲欧洲精品一区二区精品久久久| 夜夜嗨av色一区二区不卡| 国产性猛交xxxx免费看久久| 欧美成人激情在线| 欧美亚洲午夜视频在线观看| 亚洲日本成人| 久久久久网址| 亚洲在线国产日韩欧美| 在线免费不卡视频| 国产精品亚洲片夜色在线| 免费视频亚洲| 性久久久久久久久久久久| 亚洲国产欧美久久| 久久久av网站| 亚洲欧美国产另类| 91久久精品网| 国产一区在线观看视频| 欧美色图麻豆| 欧美激情亚洲激情| 久久久久久有精品国产| 亚洲性视频网址| 日韩一区二区精品在线观看| 欧美成人免费小视频| 久久av一区二区三区亚洲| 一区二区欧美国产| 亚洲精选中文字幕| 亚洲国产精品一区二区久| 国产亚洲a∨片在线观看| 欧美日韩一区二区三| 欧美.www| 久久天天躁夜夜躁狠狠躁2022| 午夜精品视频一区| 亚洲一区二区三区在线| 日韩视频在线永久播放| 亚洲国产精品毛片| 亚洲成色www8888| 欧美激情精品久久久久久久变态| 久久噜噜亚洲综合| 久久久久国色av免费看影院| 先锋资源久久| 性亚洲最疯狂xxxx高清| 亚洲欧美日本视频在线观看| 亚洲性av在线| 亚洲欧美日韩天堂| 欧美亚洲免费| 欧美专区在线观看| 久久av资源网站| 久久美女艺术照精彩视频福利播放| 欧美一区在线看| 久久久精品国产一区二区三区 | 国产日韩av一区二区| 国产精品美女久久福利网站| 国产精品女主播一区二区三区| 欧美午夜不卡影院在线观看完整版免费| 欧美日本一道本| 国产精品www994| 国产精品自拍网站| 激情欧美一区二区三区| 亚洲丰满在线| 99视频在线观看一区三区| 亚洲一区二区三区在线观看视频 | 极品少妇一区二区三区精品视频| 国产在线视频不卡二| 一区二区三区自拍| 99亚洲精品| 亚洲欧美网站| 久久一区二区三区av| 欧美激情精品久久久六区热门| 91久久国产自产拍夜夜嗨| 日韩午夜视频在线观看| 亚洲欧美日韩国产| 久久婷婷av| 欧美午夜国产| 国内激情久久| 99riav国产精品| 欧美在线播放| 欧美韩日一区二区| 亚洲视频电影在线| 久久久久久91香蕉国产| 欧美日韩a区| 国产亚洲美州欧州综合国| 亚洲片在线资源| 久久精品九九| 亚洲精品在线一区二区| 欧美一区二区在线看| 欧美激情第8页| 国产色综合天天综合网| 亚洲免费黄色| 久久久青草青青国产亚洲免观| 亚洲人成网站影音先锋播放| 欧美一区二区性| 欧美日韩免费高清| 亚洲国产成人porn| 久久国产欧美日韩精品| 亚洲每日更新| 免费在线视频一区| 激情欧美一区|