문제 개요
문제는 단순한 수식 문제처럼 보이지만, 실제로는 입력 형식과 조건이 어긋나는 것을 이용한 논리적 낚시 문제입니다.
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)
결론
이 문제는 버퍼 오버플로우나 포맷 스트링 등 전통적인 익스플로잇 기법이 필요한 것이 아니라, 입력과 출력의 진법 차이를 헷갈리게 만들어 오답을 유도하는 논리 문제입니다.