본문 바로가기

System Hacking/vortex

overthewire :: Vortex level7 by ORANG



CRC32의 취약점을 이용한 문제


코딩자체보다는 CRC32 알고리즘을 이해하는데 시간이 더 들었다..


http://anch0vy.tistory.com/60 -> anch0vy님이 쓴 글이 도움이 많이 되었다.


내가 이해한대로 기록해두자면..

CRC32(cyclic redundancy check)는 데이터에 오류가 있는지를 확인하기 위한 체크값을 결정하는 방식이다.

미리 만들어진 256개의 테이블을 통해 1바이트 단위로 계산하는데,

'>>8' 과정에서 최상위 바이트가 0이 되므로, 테이블의 최상위값 바이트가 남게된다.

이를 통해 해당 테이블을 알아낼 수 있다.


또, 1바이트 단위로 시프트 연산이 진행되므로

CRC32 는 4바이트(32bit), CRC64 는 8바이트(64bit)만 조작할 수 있다 면

역연산 과정을 통해

이전까지 계산된 crc값을 내가 원하는 특정 crc 값으로 조작할 수 있다.


crc 알고리즘 -> (crc>>8)^table[idx] // idx는 상위 1byte


이해하고 보니 알고리즘 자체는 단순하다. 테이블이 주어져있다면 특히 쉬워지는 듯..

(주어진 vortex 문제를 보면, 문제에서 crc_table를 얻어야 한다는데 이부분은 더 생각 필요)


먼저 조작에 필요한 테이블 값을 얻기 위해

'현재 가진 crc 값 -> 이전 테이블 유추 -> 역연산을 통해 이전 crc값 획득' 으로 접근했다.

그리고, 이전 문자열들에 대한 crc값과 결과적으로 목표 crc값을 연산해

crc값을 조작하기 위한 값을 알아냈다.

역연산 중에는 상위 1바이트로 테이블 값을 유추해 이전 crc값에 접근했지만,

CRC연산 중에는 index를 통해 다음 테이블에 접근하게 된다. 이 점을 유의해야한다.



<참고>

http://anch0vy.tistory.com/60

http://ko.wikipedia.org/wiki/순환_중복_검사

http://truthtilltheend.tistory.com/33






"(1바이트 연산 -> table[index] xor 연산) 반복" -> 을 생각하면 생각만큼 복잡하지 않다. 

 

환경변수로 nop+쉘코드를 올리고 공격했다.



ebp - buf = 70






vortex7.c


Reversing_crc32.py