본문 바로가기

Write Up

2016 CodeGate Final rev



두 명 푼 250점 리버싱 문제입니다. 64비트 ELF이고 Go언어로 작성된 프로그램 입니다. 일단 실행시켜 보겠습니다.

막 good good wrong wrong 출력하고 끝납니다. 모두 good이 나오는 키를 찾으면 될 것 같습니다.

먼저 IDA로 까 보겠습니다. Go는 언어 특성상 헥스레이가 안되기 때문에 순 어셈만 보고 분석했습니다.

먼저 입력을 받고 

길이 체크 후에 메인 체크 루틴으로 넘어갑니다.

길이는 15글자 이상이어야 합니다. 후에 메인 체크 루틴으로 넘어가면 

그래프뷰 보고 쫄았지만 디버깅 하면서 분석하니까 크게 힘들지는 않았습니다.

먼저 

스트링의 첫 번째 글자와 마지막 글자를 가져와서 비교합니다. 만약 같다면 wrong을 출력합니다. 그 다음으로 


첫 글자와 끝 글자가 숫자/알파벳 범위에 없고 합이 0xf8이어야 하는 것으로 보아 시작과 끝 글자가 '{', '}'로 정해져 있다는 것을 알 수 있습니다. 이를 만족하지 않으면 wrong을 출력합니다. 

다음은 

{ }사이에 있는 값이 문자로 0~9, A~F 사이에 있는지 확인합니다. 그러고 난 후에 사이에 없다면 wrong을 출력합니다. 

그 다음 입력 값에서 { }사이의 값들의 합을 구합니다. 여기서 모든 글자의 합을 구하는 것이 아니라 전체 길이의 앞 절반의 합만 구해야 합니다. 그 길이가 0x38f이어야 하고 만족하지 않을 시 wrong을 출력합니다. 임시적으로 입력값을 {BBBBBBBBBBBBB5BBBBBBBBBBBBB5} 이렇게 넣고 하면 됩니다. 그 다음에 sum값이 올바른지 한 번 더 확인을 하고 다음으로 넘어갑니다. 

그 다음은 입력 값 첫 번째 글자와 두 번째 글자를 정수형으로 가져와서 차가 2이고 합이 14인지를 확인합니다. 차가 2면서 합이 14이며 두 번째 글자가 더 커야 하므로 첫 번째 글자는 6, 두 번째 글자는 8이어야 합니다. 

그 다음은 단순 비교입니다. 처음부터 전체 길이의 절반 만큼을 오른쪽 하단에서 입력값과 실제 키 값과 한 글자씩 비교합니다. 여기까지 했을 때 현재까지의 시리얼은 {681D62F73B520ABBBBBBBBBBBBB5} 입니다. 

그 후부터도 인덱스 순서만 바꿔가면서 한 바이트씩 비교하니까 그냥 인내심만 가지고 디버깅 하면서 어떤 값이랑 비교하는지만 확인하면서 키 값을 만들어 주면 됩니다. 

key : 681D62F73B520A4F6063B7128FF0D645

'Write Up' 카테고리의 다른 글

2016 ASIS CTF Quals - firtog  (0) 2016.05.09
2016 ASIS CTF Quals - Catch Me!  (0) 2016.05.09
2016 CodeGate Final GMPQZ  (0) 2016.05.04
2016 CodeGate Final BMP  (0) 2016.05.04
2015 Christmas CTF vsnoted  (0) 2016.04.30