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

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 閱讀(371) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品美女久久久久久免费| 欧美激情成人在线视频| 久久久久久久久一区二区| 欧美日韩国产精品一卡| 国产精品va在线播放| 在线观看日韩av先锋影音电影院| 在线亚洲成人| 欧美黄色小视频| 久久av二区| 国产乱人伦精品一区二区| 久久久久久久久蜜桃| 亚洲一区二区三区午夜| 国产一区日韩一区| 久久爱另类一区二区小说| 亚洲毛片视频| 国产亚洲福利一区| 欧美一区二区日韩一区二区| 久久久欧美精品sm网站| 亚洲欧美日韩视频二区| 国产精品免费看久久久香蕉| 久久综合九色综合久99| 久久精品成人一区二区三区蜜臀 | 欧美日产一区二区三区在线观看| 欧美午夜一区| 久久蜜桃精品| 久久精品成人一区二区三区蜜臀| 亚洲免费久久| 国产一区欧美| 久久久久一区二区三区| 欧美一级视频精品观看| 国产日韩欧美一区| 亚洲精品偷拍| 欧美日韩国产专区| 久久婷婷国产综合国色天香| 麻豆国产精品va在线观看不卡| 伊人影院久久| 亚洲欧美在线免费观看| 国产精品视频99| 欧美91大片| 亚洲一区免费视频| 黄色av一区| 欧美在线视频不卡| 久热精品在线视频| 99国产精品久久| 午夜精品999| 亚洲性av在线| 久久久精品日韩欧美| 国产精品亚洲аv天堂网| 亚洲精品裸体| 欧美日韩麻豆| 亚洲国产精品高清久久久| 欧美视频成人| 性做久久久久久久久| 欧美日韩国产限制| 久久精品视频网| 国产女人精品视频| 亚洲国产精品第一区二区三区| 欧美激情影音先锋| 亚洲片在线观看| 一区二区三区免费网站| 亚洲一区二区三区免费观看 | 久久精品免费| 久久久精品国产免大香伊| 蜜桃av噜噜一区| 欧美高清视频| 国产精品综合网站| 午夜精品久久久久久久男人的天堂| 欧美母乳在线| 另类亚洲自拍| 亚洲福利一区| 性做久久久久久久免费看| 国产精品美女黄网| 亚洲成在线观看| 韩国一区二区三区美女美女秀| 亚洲欧美一区二区视频| 妖精视频成人观看www| 欧美日韩成人| 欧美黄色成人网| 国产在线精品二区| 乱中年女人伦av一区二区| 欧美在线不卡| 在线观看91精品国产入口| 午夜精品福利在线观看| 亚洲激情国产| 久久久亚洲精品一区二区三区| 亚洲欧美日韩国产| 国内伊人久久久久久网站视频| 99精品热视频| 久久精品一二三| 久久成人国产| 最新69国产成人精品视频免费| 亚洲欧美日韩国产精品| 亚洲欧美日韩精品综合在线观看| 国产精品欧美日韩久久| 亚洲色在线视频| 黑人一区二区| 欧美日韩亚洲网| 亚洲免费福利视频| 久久精品九九| 国产美女精品免费电影| 久久久久久网| 欧美电影在线观看| 国产精品久久久久aaaa| 玖玖玖国产精品| 欧美高清视频免费观看| 欧美在线视频观看| 韩国女主播一区二区三区| 欧美激情一区二区三区在线| 一本一本久久a久久精品综合妖精| 久久久久久久一区| 亚洲欧洲视频在线| 亚洲一区二区三区在线视频| 国产精品日韩高清| 久久精品国产99精品国产亚洲性色| 国产精品一区二区视频 | 欧美成人xxx| 免费在线日韩av| 亚洲精品中文字幕女同| 精品成人在线观看| 欧美成人首页| 久久久久国产精品一区三寸| 欧美成人精品一区二区三区| 午夜欧美视频| 在线观看国产精品网站| 性久久久久久久久久久久| 99视频精品免费观看| 欧美一区二区视频在线| 中日韩视频在线观看| 国产精品人人做人人爽人人添 | 欧美在线视频导航| 亚洲黑丝一区二区| 在线成人av| 欧美性大战久久久久久久蜜臀| 欧美成人一区二区三区| 亚洲一区二区在线视频| 亚洲免费播放| 欧美凹凸一区二区三区视频| 亚洲国产福利在线| 亚洲第一区在线| 欧美午夜在线观看| 国产精品成av人在线视午夜片| 欧美在线视频播放| 久久电影一区| 一区二区精品国产| 在线视频欧美一区| 亚洲国产片色| 午夜精品久久久久久久| 国产日本欧美一区二区| 欧美黄色aa电影| 日韩午夜电影| 欧美二区在线播放| 久久久久国产精品一区| 亚洲欧美一区二区三区极速播放| 亚洲欧洲在线一区| 欧美午夜精品理论片a级按摩| 亚洲人成人99网站| 亚洲国产日韩欧美在线动漫| 伊人成人开心激情综合网| 欧美日韩1080p| 欧美亚男人的天堂| 欧美二区视频| 欧美激情久久久| 久久偷看各类wc女厕嘘嘘偷窃| 久久精品日韩| 男人插女人欧美| 久久久久亚洲综合| 亚洲国产日韩一级| 欧美大片专区| 99re热这里只有精品视频| 亚洲国产精品久久久久秋霞不卡| 欧美国产一区二区在线观看| 欧美成年人网站| 国产亚洲一区在线播放| 亚洲精品乱码久久久久| 亚洲国产激情| 亚洲午夜免费福利视频| 亚洲美女精品成人在线视频| 午夜精品在线| 亚洲一二三区视频在线观看| 久久精品中文| 久久天天狠狠| 亚洲九九九在线观看| 99国内精品| 亚洲精品久久久久中文字幕欢迎你 | 午夜免费电影一区在线观看| 亚洲一区二三| 欧美激情在线免费观看| 欧美激情第1页| 狠狠色综合网| 亚洲国产精品女人久久久| 亚洲影院免费| 久久久久综合| 91久久精品日日躁夜夜躁欧美 | 欧美成人a视频| 亚洲天天影视| 欧美伊人久久久久久午夜久久久久 | 在线一区二区三区四区五区| 亚洲一区二区三区免费视频| 亚洲经典自拍| 亚洲视频在线观看免费|