본문 바로가기

2016 ASIS CTF Quals - Catch Me! 대회 전체적으로 리버싱이 상당히 어렵게 나왔다.. 5문제 나왔는데 최종적으로는 이 문제 하나밖에 못풀었다. 아무래도 리버싱 문제를 풀 때 인내심이 약간 떨어진 것 같다. 본선 올라갔으니까 본선 문제는 빡세게 제대로 잡고 다 분석하겠다는 마음으로 풀어봐야겠다. 이 문제는 x64 elf 바이너리이고 xmm 레지스터를 이용한 연산을 많이 한다. main함수의 코드는 이게 다이다. sub_400820의 함수 리턴값은 항상 0xB11924E1로 같으므로 크게 신경쓸 것은 없다. 그 후에 이 값들을 이용해서 0x6012A8부터 네 바이트 값을 만들어 내고 ASIS와 CTF 환경변수의 값들을 가져와서 CTF 환경변수의 값과 0xB11924E1 이 값을 xor했을 때의 값이 0xFEEBFEEB이면 ASIS 환경변수에 .. 더보기
2016 CodeGate Final rev 두 명 푼 250점 리버싱 문제입니다. 64비트 ELF이고 Go언어로 작성된 프로그램 입니다. 일단 실행시켜 보겠습니다.막 good good wrong wrong 출력하고 끝납니다. 모두 good이 나오는 키를 찾으면 될 것 같습니다.먼저 IDA로 까 보겠습니다. Go는 언어 특성상 헥스레이가 안되기 때문에 순 어셈만 보고 분석했습니다.먼저 입력을 받고 길이 체크 후에 메인 체크 루틴으로 넘어갑니다.길이는 15글자 이상이어야 합니다. 후에 메인 체크 루틴으로 넘어가면 그래프뷰 보고 쫄았지만 디버깅 하면서 분석하니까 크게 힘들지는 않았습니다.먼저 스트링의 첫 번째 글자와 마지막 글자를 가져와서 비교합니다. 만약 같다면 wrong을 출력합니다. 그 다음으로 첫 글자와 끝 글자가 숫자/알파벳 범위에 없고 합이.. 더보기
2016 CodeGate Final GMPQZ 6명 푼 미스크 문제입니다.이렇게 생긴 파일 하나 달랑 줍니다. 여기서 맨 앞에 있는 0x78 0x9c는 zlib이라는 압축 알고리즘의 시그니쳐 입니다. 내부에 시그니쳐가 많이 보이는 것으로 보아 여러개가 모여 있는 것 같습니다. 파이썬 소스를 짜서 몽땅 압축을 풀어 줍니다. 123456file = open('GMPQZ', 'rb').read().split('\x78\x9c') data = ''for i in range(1, len(file)): data += ('\x78\x9c' + file[i]).decode('zlib')open('decypted', 'wb').write(data)cs처음에는 압축이 풀린 것을 하나하나 다른 파일에 저장했는데 열어서 확인해 보니 중간 중간 0x55 0xaa로 끝나는 .. 더보기