picoCTF 2018 leak-me - Points: 200

3236 단어 picoCTFCTF

문제





풀어 보았다.



소스 코드를 살펴보면 flag.txt를 출력하는 처리가있었습니다.



이 함수를 호출하면 좋을 것 같습니다.
호출자를 확인해 봅니다.



main() 함수 안에서 패스워드가 있으면 호출되는 것 같습니다.
ltrace를 사용하여 strcmp의 인수를 보려고 생각했지만 nc로 연결할 때 어떻게 할지 몰랐습니다.
그래서 우선 이름의 입력과 패스워드의 입력의 자리수를 초과해 보려고 합니다.



이름은 256자를 넘고 암호는 64자를 넘어갑니다.

우선 이름에서



끝에 이상한 문자열이 붙었습니다.
우선 패스워드에 넣어 보겠습니다.



끝났어.

무슨 일이야?





42행에 name을 입력합니다.
CTFman을 입력하면 다음과 같이 저장됩니다.


첫 문자
두 번째 문자
세 번째 문자
네 번째 문자
다섯 번째 문자
여섯 번째 문자
일곱 번째 문자


C
T
F
m
a
n
¥0


48행째의 strcat는 종단 문자를 지워 문자열 결합해 마지막에 종단 문자를 붙인다.


첫 문자
두 번째 문자
중략
여섯 번째 문자
일곱 번째 문자
8문자
9문자
중략
마지막-2문자
마지막-1 문자
마지막 문자 눈


C
T
중략
n
\n
P
l
중략
d
.
¥0


됩니다.
그래서 59행째로 이것을 표시한다.
라는 흐름입니다.

이것은 결과론이지만 메모리에서 name 변수 바로 뒤에 password 변수가있는 것 같습니다.
∵ 이번 해결 방법으로 name 변수를 오버플로우 했을 때에 패스워드가 표시되었기 때문입니다.

설명합니다.
우선 name 바로 뒤에 password가 있다고 가정합니다.

name 배열은 256 문자이므로 그것을 넘는 문자를 입력했을 때에 조금의 흐름은 어떻게 되겠지요.
해보자. A를 많이 입력한다고 가정합니다.


첫 문자
두 번째 문자
중략
256자
257자


A
A
중략
A
¥0


42행째에 이런 느낌의 문자열을 입력했다고 합니다.
그러면 48행째에서는 다음과 같이 됩니다.


첫 문자
두 번째 문자
중략
256자
257자
258자
중략
마지막-2
마지막-1
마지막


A
A
중략
A
\n
P
중략
d
.
¥0


이것이 59행에 그대로 표시된다고 생각했는데, 56행의 처리로 패스워드를 변수에 대입하고 있습니다.
그래서 name 직후에 있는 password가 덮어쓰기 때문에 (비밀번호는 p가 계속된다고 해)


첫 문자
두 번째 문자
중략
256자
257자
258자
중략
pass 마지막-1
pass 마지막


A
A
중략
A
p
p
중략
p
¥0


됩니다.
그리고 59행째로 문자열을 표시할 때에 종단 문자는 name에는 없고 직후에 계속되는 패스워드에 종단 문자가 있으므로 여기까지 표시되어 버린다.

그렇죠?

좋은 웹페이지 즐겨찾기