HackCTF Write Up/Reversing

HackCTF Reversing Keygen Write Up

서원근양학계정 2021. 9. 20. 00:30

https://ctf.j0n9hyun.xyz/challenges

 

HackCTF

Do you wanna be a God? If so, Challenge!

ctf.j0n9hyun.xyz

 

이 문제를 IDA로 열어보도록 하겠습니다.

아마도 check_key의 값이 참이면 플래그를 출력하는 프로그램인 것 같습니다.

입력한 문자열의 길이가 9자 이상 64자 미만이어야 합니다.

그리고 입력한 문자열을 encoding이라는 함수를 통해서 값을 바꿔준 후에

"OO]oUU2U<sU2UsUsK"와 같으면 성공인 것 같습니다.

입력한 값은 이 과정을 거치면서 변형됩니다.

이제 이 부분을 C언어로 이식한 다음 무차별 대입을 통해서 답을 구해보도록 하겠습니다.

#include <stdio.h>
int main() 
{
    int i,j,k=0;
    int a=72,b;
    char string[17]={"OO]oUU2U<sU2UsUsK"};
    char flag[100]={"0"};
    for(i=0;i<17;i++)
    {
	    for(j=33;j<127;j++)
	    {
		    b=((j+12)*a+17)%70+48;
		    if(b==string[i])
		    {
		        a=b;
		        flag[k]=j;
		        k++;
		        break;
	            }
	    }
    }
    printf("%s",flag);
    return 0;
}

이렇게 해서 나온 값은 "A,d<&$+$''.+$&.&&"입니다.

이제 이 값을 문제 서버에 넣어주면...

놀랍게도 아무 일도 일어나지 않습니다.

왜 그런가 하고 검색을 해봤더니 문자열을 입력받는 fgets함수가 원인이었습니다.

fgets함수는 문자열을 입력받을 때 마지막에 입력되어있는 개행 문자(\0)까지 입력받기 때문입니다.

따라서 마지막에 있는 "&"를 지운 "A,d<&$+$''.+$&.&"를 입력하면 답을 얻을 수 있습니다.

 

답:HackCTF{Y0u_5ucc33d3d_w1th0ut_d1fficul7y?}