Keygen 문제풀이를 시작하겠습니다😀

먼저 nc로 접속하여 실행해보았습니다.

실행해보니 키를 입력하라고 하고 임의의 문자열을 입력했더니 아무런 반응이 없습니다.
그럼 IDA로 열어서 확인해보겠습니다.

main 함수를 살펴보니 버퍼를 할당하고 임의이 입력값을 puts함수와 fgets함수로 받아오는 걸 볼 수 있습니다.
이후 check_key 함수에서 입력한 값을 통해 0 이외의 값을 받아내면 flag를 출력시키는 것을 확인할 수 있네요😀
그럼 check_key 함수를 확인해보도록 합시다.

확인해보니 5번째 줄에 if 함수로 입력한 값의 길이가 9이하 이거나 64이상이면 바로 빠져나오게됩니다.
그리고 s2 변수에 입력한 값이 인코딩된 것을 담게 되고
strcmp 함수를 이용해 "OO]oUU2U<sU2UsUsK"값과 s2의 값을 비교하여 0과 비교한 값을 리턴시킵니다.😀
strcmp의 함수는 인자 2개의 문자열을 처음부터 하나씩 비교하여 -1, 0, 1의 결과를 내게 되어있습니다.
-1일 경우 : 첫번째 인자가 두번째 인자보다 작을 때
0일 경우 : 두 인자가 같을 때
1일 경우 : 첫번째 인자가 두 번째 인자보다 클 때
즉, strcmp() 함수의 결과가 0(같을 때)이 되면 0과 비교하여 결과가 1이 되어 1을 리턴하고
main 함수에서 flag를 출력하는 형식이 되겠네요😀

그럼 입력값이 인코딩되어 s2에 담기게 되니까 Encoding 함수를 분석해야하겠죠?😀

8번 ~ 10번 줄은 주석으로 제가 달아놓았습니다.
for문을 보니 입력한 값을 차례대로 암호화하고 있는 것이 보이네요😀
식이 주어졌으니 간단하게 Python을 이용하여 코딩을해서 풀어보았습니다!

몇 줄 안되는 엄청 간단한 코드죠! 그리고 돌려서 나온 결과값은..!

이걸 그대로 넣어보니 flag를 출력을 안하더라구요..! 그래서 gdb로 결과값을 확인해 보았습니다😀

위의 사진은 Encoding 후 값인데 "i"가 추가되어 있는 것을 볼 수 있습니다.
그럼 맨뒤 문자(&)를 빼서 확인을 해봐야될 것 같네요!

확인해보니 정답이 되네요! fgets의 경우 뒤의 개행문자까지 포함이 되어서 하나를 빼줘야 하는 것 같습니다.😀

이렇게 flag를 획득하게 되었습니다!
이만 Keygen 문제풀이를 마치도록 하겠습니다.😁
'CTF > HackCTF' 카테고리의 다른 글
Reversing - Strncmp (0) | 2021.01.05 |
---|---|
Web - LOL (0) | 2020.09.28 |
Reversing - Handray (0) | 2020.04.07 |
Forensics - 잔상 (0) | 2020.04.02 |
Forensics - Terrorist (0) | 2020.03.31 |