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 |