HackCTF Write Up/Reversing

HackCTF Reversing Handray Write Up

서원근양학계정 2021. 9. 19. 20:46

https://ctf.j0n9hyun.xyz/challenges

 

HackCTF

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

ctf.j0n9hyun.xyz

 

이 문제는 이름이 이름인 만큼 바로 IDA로 열어보았습니다.

 

이것이 이 프로그램의 구조입니다.

주목할 부분은 40058D주소로 가면 실패메시지가 뜨게 되는데 main함수에서 rbp+var_4 주소에 1을 넣고

0과 비교를 해서 다르면 40058D로 점프합니다.

점프를 하지 않으면 400571과 400544를 왔다 갔다 하게 됩니다.

rbp+var_8의 값을 카운터로 사용하는데 0x1E라는 값을 넣어주고 작거나 같을 때 점프하는 jle명령어가 있으므로

31번 동안 반복한다는 것을 알 수 있습니다.

400544는 string과 array에서 한 글자씩 가져와서 더한 다음 다시 string에 넣어주는 코드입니다.

 

이 과정을 C언어로 코드를 짜서 답을 구해보도록 하겠습니다.

#include <stdio.h>
int main()
{
	int i;
        int array[33]={0x7,0x4,0x3,0x1,0x4,0x6,0x3,0x1,0x9,0xA,0xB,0xC,0xD,0xE,0xF,0x10,0x1,0x1,0x1,0x2,0x2,0x2,0x3,
        0x4,0x5,0x2,0x5,0x2,0x2,0x2,0x2,0x2,0x0};
        int string[33]={0x41,0x5D,0x60,0x6A,0x3F,0x4E,0x43,0x7A,0x3F,0x65,0x69,0x48,0x62,0x3A,0x52,0x5E,0x43,0x6B,
        0x64,0x41,0x2E,0x6A,0x61,0x50,0x2B,0x46,0x2B,0x2E,0x2E,0x6A,0x62,0x21,0x7D};
	for(i=0;i<31;i++)
	{
		string[i]+=array[i];
	}
	for(i=0;i<33;i++)
	{
		printf("%c",string[i]);
	}
	return 0;
}

 

답:HackCTF{HotToHanDleC0ldT0H000ld!}