HackCTF Reversing 네 번째 문제는 Strncmp이다.
그냥 문제 이름만 봤을 때는 문자열을 비교하는 것과 관련된 문제일까 싶었다.
main 함수 부분이다. v4에 사용자가 입력한 문자열을 저장하고 있다.
이후 strcmp_ 함수에 v4가 인자로 전달되고, v5는 문자 'O'이다.
strcmp_(&v4, &v5)의 형식으로 인자를 전달해 비교를 진행하고 있다. 따라서 a1은 우리가 입력한 문자열인 v4에 대한 것이고, a2는 원래 스택에 있던 값인 v5이고, 이는 a2 문자열은 v5부터 v32까지의 문자열이라고 할 수 있다.
입력받은 문자열을 key로 xor 한 것과 a2를 strcmp_해서 return 값이 0이면 (두 문자열이 같으면) "Good game"이면 1이면 "Always dig deeper"의 문자열을 출력하는 것을 볼 수 있다.
즉, 문자열을 정상적으로 입력하기 위해서는 확실하게 아는 a2 문자열을 key로 xor 한 값을 입력해 줘야 한다.
check 함수의 내용이다. 이 함수에서 key 값을 찾아낼 수 있다.
v3 * (v3 - 14) == -49의 방정식을 풀게 되면 key = v3이므로 key 값은 7 임을 알 수 있다.
이제 위의 내용들을 이용해 플래그를 알아내는 코드를 짜 보자.
1
2
3
4
5
6
7
8
|
#include <stdio.h>
#include <string.h>
int main() {
char* s = "Ofd1DSA|3tXb32~X3tX@sX`4tXtz";
for (int i = 0; i < strlen(s); i++)
printf("%c", s[i] ^ 7);
}
|
위와 같이 코드를 작성해 Flag 값을 알아낼 수 있었다.
[HackCTF-Reversing#6] static - 250 points (0) | 2021.01.06 |
---|---|
[HackCTF-Reversing#5] keygen - 200 points (0) | 2021.01.06 |
[HackCTF-Reversing#3] Handray - 100 points (0) | 2021.01.03 |
[HackCTF-Reversing#2] Reversing Me - 100 points (0) | 2021.01.02 |
[HackCTF-Reversing#1] Welcome_REV - 50 points (0) | 2021.01.01 |
댓글 영역