[Wargame] CERTIS autorev

Posted by MrBIN on January 7, 2017

Autorev

  • nc로 접속하면 라운드마다 바이너리를 하니씩 날려 줌.
  • 문제 제목 그대로 자동화 리버싱 툴을 만들어 풀어야 함.

  • 그래프 뷰가 매우 기괴하게 생겼음. img1


  • 아래 코드를 바탕으로 정형화된 형식을 찾음. img2 img3
from pwn import *

def make_binary():
    f = open("aa","w")
    print s.recvuntil("...\n")
    data = s.recvuntil("Answer ->", drop=True)
    f.write(data)
    return s

def make_objdump():
    os.system("objdump -M intel -D aa | grep -2i cmp > a.txt")

def remove_file():
    os.system("rm aa")
    os.system("rm a.txt")

def read_file():
    f = open("a.txt","r")
    value_list = []
    key_list = []
    for line in f:
        if "movzx" in line:
            line_ = line.replace(" ","")
            line_ = line_.split(",")
            line_ = line_[-1].replace("\n","")
            line_ = line_.replace("BYTEPTR[rbp-","").replace("]","").replace("0x","")
            line_ = int(line_ , 16)
            key_list.append(line_)

        elif "al," in line:
            try:
                line = line.replace(" ","")
                line = line.split(",")
                line = line[-1].replace("\n","").replace("0x","")
                line = int(line , 16)
                value_list.append(line)
            except:
                continue
            if len(value_list) > 300:
                del value_list[0]
    dic = {}
    for i in range(len(key_list)):
        dic.update({key_list[i]:chr(value_list[i])}) #add dic item

    print dic
    st = ""
    for j in dic.values():
        st += j
    st = ''.join(reversed(st)) # string reverse
    return st

def send_key(fd,key):
    print key
    fd.sendline(key)
    print fd.recv(1024)

if __name__ == '__main__':
    s = remote("wargame.kimtae.xyz",10013)
    p = log.progress('start...')
    i = 0
    while True:
        try:
            p.status(str(i+1))
            fd = make_binary()
            make_objdump()
            key = read_file()
            send_key(fd,key)
            remove_file()
            i+=1
        except:
            break
    s.interactive()

img4

  • 라운드를 모두 거치면 플래그를 받을 수 있음.