대회 때 제법 많은 팀들이 풀었길래 궁금해서 대회 끝나고 풀어봤다
리버싱+암호 문제였는데
리버싱도 익숙하지않고.. 암호공부를 열심히 안한터라.. 되게 오래 걸렸다
그래도 리버싱문제에 익숙해 지기 위해 분석을 끝까지 해봤다
먼저 문제는 themida packing이 되어있었다.
그냥 실행시키고 attach하면 패킹이 풀린 상태라서 그때 덤프를 뜨면 ida로 정적 분석이 가능했다.(vm이 없기 때문에 이렇게 쉽게 패킹이 까진다고 한다)
근데 덤프뜬 파일을 동적분석하려니 많이 깨져서(아마 헤더 문제가 아닌가 싶다)
동적분석은 attach시켜서 401000부터 실행하니까 코드가 안깨졌다.
까보면 c0nGr47uRaTioN!_Y0U_F0uNd_A_k3y!
라는 딱봐도 수상한 문자열이 있는데 이를 호출하는 곳으로 가보면
이렇게 비교를 하는 부분이 있다.
0x403020을 reference하는 곳으로 따라가봤다(ida xref)
아무튼 가보면
이런 루틴을 찾을 수 있다.
cl=[var_104]
[var_104]=[var_104]^[edi]
[key]=[key]^cl^[edi]
edi가 증가하고 있으므로 edi를 plain이라 추측한다
결론을 말하자면 CBC모드 암호화이다.
루틴은 그림과 같다 이상하지만 손아프게 그렸다.
식으로 나타내면 이런식
동적 분석을 해보면 0x403020에는 초기값 32바이트가 들어있다.
암호화의 key값이었다.
#routine
#r1=key[i]^ans[i]
#arr[i]=r1^ans[i-1]
복호화 코드는 그래서 이렇게 짤수 있다.
for i,a in enumerate(arr):
ans[i]=int(key[i],16)^ord(arr[i])
for i in range(32,0,-1):
ans[i]^=ans[i-1]
전체 코드
key='37 06 10 66 3A 38 50 4D 02 01 63 01 36 63 53 7F 4A 62 4B 2D 4D 64 76 7D 25 75 5E 6E 74 0C 7C 18'.split() arr='c0nGr47uRaTioN!_Y0U_F0uNd_A_k3y!' ans=[0]*33 out='' print(len(arr)) for i in range(len(key)): key[i]='0x'+key[i] for i,a in enumerate(arr): ans[i]=int(key[i],16)^ord(arr[i]) #print(hex(ans[i+1])) for i in range(32,0,-1): ans[i]^=ans[i-1] for i in range(0,32): out+=chr(ans[i]) print(out) #routine #r1=key[i]^ans[i] #arr[i]=r1^ans[i-1] #TbH_iDk_h0W_1T_R3AlLy_W0rk5.. :<'
'CTF' 카테고리의 다른 글
[VolgaCTF]guessing_game 200pt (8) | 2017.03.25 |
---|---|
[codegate 2017 prequal]hunting (0) | 2017.02.13 |
[codegate17 prequal]messenger (0) | 2017.02.11 |
[codegate17 prequal]angrybird (0) | 2017.02.11 |
[HITCON2014]stkof (0) | 2017.02.07 |