본문 바로가기
Write Up/CTF

Defcon CTF 2017 Sorcery

by wlgpdnjs 2017. 7. 5.





비슷한 형식의 실행파일 200개를 주는데 각각의 실행파일을 실행해 보면 문자열을 입력받아 비교한다.

ida로 열어봤을 때 'enter code' 문자열을 찾아서 비교문을 찾아볼려 했는데 찾을 수가 없어서 exit으로 찾음


이 위로 올라가보면 read로 입력받는 부분도 찾을 수 있으니 exit말고 read로도 찾아볼 수 있다.




cl과 비교하길래 'cmp    cl'로 찾으려 했는데 al로도 비교하는 걸 보고 'cmp    .l'로 찾았다



문자열을 찾으려면 'cmp    al,r13b' 아래부터 'cmp    al,0x68' 까지 봐야 하는데 여기 말고도 al이나 cl, dl과 비교하는 부분이 많아서 비교문이 있는 함수 끝에 있는 'add    rsp,0x88'을 이용하기로 함





다행히 'add    rsp,0x88'이 두개 밖에 없는데 두 개 중 첫 번째 주소가 비교 함수 끝에 있는 명령어여서 저 주소랑 'cmp    .l' 부분 주소랑 비교해서 원하는 부분만 가져올 수 있었다.



import os, sys, commands

ls=os.listdir('./sorcery_dist')

for fname in ls:
    command1= "objdump -d -M intel ./sorcery_dist/"+fname+" | grep 'cmp    .l'"
    command2= "objdump -d -M intel ./sorcery_dist/"+fname+" | grep 'add    rsp,0x88'"
    stop=int(commands.getoutput(command2).splitlines()[0][:8],16)
    result=commands.getoutput(command1).splitlines()
    result.sort()
    print "=========="+fname+"=========="
    for line in result:
        if int(line[:8],16) < stop :
            try:
                sys.stdout.write(chr(int(line[-4:],0)))
            except:
                continue
    print ""


grep으로 가져온 것들 중 처음 'cmp    al,r13b' 때문에 chr에서 에러가 나서 예외처리도 해줬다




'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 Alchemy  (0) 2017.07.08