본문 바로가기
Write Up/CTF

Defcon CTF 2017 Alchemy

by wlgpdnjs 2017. 7. 8.


alchemy는 crackme 2000의 6문제중 하나로 crackme의 다른 문제들과 똑같이 200개의 바이너리를 주고 각 파일의 키값을 찾는 문제다.


처음에 찾을 때는 main함수에서 첫번째로 실행되는 함수가 있어서 들어가 보니까 입력받은 문자열과 한글자씩 비교하는 if문들이 여러개 있어서 찾을 수 있었는데, 나중에 보니까 'enter code: ' 문자열을 사용하는 곳으로 찾아가도 비교하는 부분을 확인할 수 있었다.



비교하는 값으로 아예 아스키 값이 들어가니까 cmp를 이용해 키값을 찾을 수 있다




비교문을 보면 rcx와 아스키 값을 비교하는데 rcx에는 입력한 문자열에서 한 글자씩 가져온 값이, r15d는 인덱스 값이 들어간다.

objdump를 사용해 'cmp    rcx,0x'를 이용해서 찾으려고 했는데 rcx와 비교하는 값들이 많아서 r15d를 이용했다.

여기서 주의할 건 처음엔 'cmp    r15d, 0'이 아니라 'test    r15d,r15d'로 비교하는 거랑 마지막 문자를 비교할 때는 rcx가 아니라 rax로 비교한다는 거!


import os, sys, commands

ls=os.listdir('./alchemy_dist')
ls.sort()
for fname in ls:
    command1= "objdump -d -M intel ./alchemy_dist/"+fname+" | egrep -A 40 '(test   r15d,r15d|cmp    r15d,0x)' | egrep '(cmp    rcx|cmp    rax)'"
    result=commands.getoutput(command1).splitlines()
    print "=========="+fname+"=========="
    for line in result:
            try:
                sys.stdout.write(chr(int(line[-4:],0)))
            except:
                continue
    print ""

한 문자씩 갖고오기 위해서 r15d랑 rcx, rax는 꼭 필요하니까 grep으로 'test    r15d,r15d', 'cmp    r15d,0x'를 찾아서 40줄 정도 긁은 다음에 rcx, rax 비교하는 부분을 다시 찾아주면 키값을 찾을 수 있다.

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

[CTF]encrypt  (0) 2018.01.14
[CODEGATE2017]HelloProtector  (0) 2018.01.07
[CODEGATE2017]RamG  (0) 2018.01.07
Defcon CTF 2017 Witchcraft  (0) 2017.07.08
Defcon CTF 2017 Sorcery  (0) 2017.07.05