http://jumpzero.tistory.com/ 에 있는 jz_crackme 를 함 풀어보았습니다.
실행을 했더니 콘솔창이 하나 뜨면서 암호를 입력하라고 합니다.
그나마 콘솔 프로그램이라서 조그마한 그래프가 열렸는데, 전 안티-디버깅 기술을
잘 모르기 때문에, scanf() 부터 분석을 시작했습니다.
입력값은 이 함수로 도달하게 되는데,
일단 인증값을 0xAF006DC3 으로 만드는것이
목적이라고 생각하여
인증값을 생성하는것 같은 함수가 1개 있길래
그 부분을 분석해 보았습니다.
강력한 툴인 notepad.exe 를 이용하여
C 언어로 번역한 인증값 생성 함수는 아래와 같은 코드를 가지게 됩니다.
C 코드 보기..
더하기 빼기 및 조건문에 걸린 hex 값들은 전부 출제자의 힌트인 것 처럼,
값을 상대적으로 맞추어 보면 4번째 글자를 제외한 스트링이 나옵니다.
4번째에 있는 값을 변경하게 되면 인증값의 0x____XX__ 부분이 변하게 됩니다.
4번째에 a 를 넣으면 0xAF007EC3 이란 값이 나오는데, 0xAF006DC3 이랑 1 바이트만 다릅니다.
for () 문을 메인 함수에 추가하여 죽 돌리면 0xAF006DC3 과 일치하는 값이 나오게 되고,
gmail 로 메일을 보내라고 합니다.
이것 또한 출제자의 자비로움이 묻어나는 부분인것 같은데,
인증 생성 함수를 둘러 싸고 있는 저 IDA 그래프 블록을 이뮤니티 디버거를 이용하여
값들을 추적해보면
a = dword_4141D4 ["78 1C 39 E4"]
checksum = hashmaker();
b = a
checksum ^= c (0x1 ["01 00 00 00"])
xor_key = b
checksum ^= xor_key
이런 이상한 값들로 채워지게 됩니다.
그럼
0xE4391C78 xor 0xAF006DC3 = 0x4B3971BB
0x4B3971BB xor 0x00000001 = 0x4B3971BA
target hashcode = 0x4B3971BA
결국 인증 생성 함수에서 뱉어내야 하는 값은 0x4B3971BA 가 되게 되는데,
안티-디버깅 기능이 들어가 있다고 말하고 있으니까, 저 값들은 이뮤니티 디버거 내부에서만
채워지는 그런 값들인것 같습니다.
안티-디버깅 기술들에 대해선 잘 아는게 없어서, 여기에 쓰지 못하는 것이 부끄럽네여.. -_-;;
그 기술들에 대해선 세율님(0range.net) 의 블로그에 걸려 있습니다 ㅎㅎ
세율님꺼 언퍀미 도 풀어보고 싶은데, 디버거로 열고 틀자마자 빡 나니까 넘 무섭네여 ㅠ_ㅠ
열심히 공부해야 가능할 것 같습니다 ㅠ_ㅠ
그럼 다들 열공하시길 ㅠ_ㅠ
날씨가 엄청 덥네요 오늘은 ㅠ_ㅠㅋ
