[Tutorial] netcat

@yd1ng· May 12, 2025 · 1 min read

문제 개요

문제는 단순한 수식 문제처럼 보이지만, 실제로는 입력 형식과 조건이 어긋나는 것을 이용한 논리적 낚시 문제입니다.

void get_flag() {
    execve("/bin/sh", 0, 0);
}

int main() {
    int ans;
    printf("0x20 + 0x18 = 0x");
    scanf("%d", &ans);
    if (ans == 38) {
        get_flag();
    }
}

취약점 분석

  • 0x20 + 0x18 = 0x38, 즉 56
  • 하지만 scanf("%d", &ans)는 10진수로 입력을 받습니다.
  • 따라서 사용자는 38을 10진수 그대로 입력해야 if 조건이 성립합니다.

익스플로잇 방법

단순히 아래와 같이 입력하면 쉘을 획득할 수 있습니다.

$ ./netcat
0x20 + 0x18 = 0x38
$ id
uid=1000(pwn) gid=1000(pwn) groups=1000(pwn)

결론

이 문제는 버퍼 오버플로우나 포맷 스트링 등 전통적인 익스플로잇 기법이 필요한 것이 아니라, 입력과 출력의 진법 차이를 헷갈리게 만들어 오답을 유도하는 논리 문제입니다.

@yd1ng
안녕하세요. 양진영입니다.
© copyright 2025. yd1ng all rights reserved.