Reversing - Keygen

HelloMG
|2021. 1. 6. 16:33

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

Reversing Keygen

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

nc ctf.j0n9hyun.xyz 9004

실행해보니 키를 입력하라고 하고 임의의 문자열을 입력했더니 아무런 반응이 없습니다.

 

그럼 IDA로 열어서 확인해보겠습니다.

main

main 함수를 살펴보니 버퍼를 할당하고 임의이 입력값을 puts함수와 fgets함수로 받아오는 걸 볼 수 있습니다.

이후 check_key 함수에서 입력한 값을 통해 0 이외의 값을 받아내면 flag를 출력시키는 것을 확인할 수 있네요😀

 

그럼 check_key 함수를 확인해보도록 합시다.

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를 출력하는 형식이 되겠네요😀

flag 출력 프로세스

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

Encoding

8번 ~ 10번 줄은 주석으로 제가 달아놓았습니다.

 

for문을 보니 입력한 값을 차례대로 암호화하고 있는 것이 보이네요😀

식이 주어졌으니 간단하게 Python을 이용하여 코딩을해서 풀어보았습니다!

,Source Code

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

결과

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

개행문자

위의 사진은 Encoding 후 값인데 "i"가 추가되어 있는 것을 볼 수 있습니다.

그럼 맨뒤 문자(&)를 빼서 확인을 해봐야될 것 같네요!

A,d<&$+$''.+$&.&

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

flag

이렇게 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