공다팩이나 다동이나 Gondad에 대한 용어는 다들 잘 아실꺼라 생각하고 생략하겠습니다.
올해 코드게이트에서도 툴 시연이 있었고 발표자료도 공개되어 있습니다.
그리고 dadong으로 난독화되어 있는 코드에 대한 분석글들은 인터넷에 있으니 찾아보시고 참고하시면 되겠습니다.
그나마 지금까지 보아 왔던 분석글들은 중간중간 특정 내용에 대한 설명이 빠져 있어서 이해하는데 좀 애매하게 되어 있었는데요
Kwang Guevara님 블로그 보니 설명이 잘되어 있었습니다.
코드가 허접해도 참아주시기 바랍니다. ;-)
#-*- coding: cp949 -*-
import sys
import re
from struct import *
key = ""
res_filename = ""
obfCode = ""
deobFunc = ""
def splitObfCode() :
global obfCode
global deobFunc
global key
obfList = []
print "[+] Extracing obfuscated code..."
with open(sys.argv[1], 'r') as ef:
for x in ef.readlines():
if re.search("eval.+?unescape.+?[=](\'\")?[0-9A-Fa-f]", x):
for s in range(len(x.split("\""))):
obfList.append(x.split("\"")[s])
print "[+] Extracting deobfuscate function and find divide key"
for x in range(len(obfList)):
if len(obfList[x]) >= 5000:
obfCode = obfList[x]
elif len(obfList[x]) >= 1000 and len(obfList[x]) <= 2000:
deobFunc = obfList[x].replace('\\/', '/').replace('\\\\', '\\')
buf = deobFunc.split(";")
for s in range(len(buf)):
if "%=" in buf[s]:
key = int(buf[s].split("=")[1])
else:
pass
def letsgo(code, func, divkey) :
a = ""
b = 0
c = 0
d = ""
print "[+] Deobfuscate..."
for i in range(0,2):
for t in range(len(func)):
c = ((c&127)<<25) | ((c&4294967168)>>7) + ord(func[t])
c = unpack("l", pack("L", c))[0]
a+="1"
if c < 0:
c = c & 0xffffffff
qq = 1
for t in range(0, len(code), 2):
if t >= 8: # (1<<3)
a = t % 8
else:
a = t
b = int(hex(c)[a+2:a+4], 16)+qq
qq+=1
if re.match('^(\d{4})', str(b+744)):
b = b % divkey
d += chr((int((obfCode[t] + obfCode[t+1]), 16))^b)
rf = open("%s" % res_filename, "w")
rf.write(d)
rf.close()
def main() :
global res_filename
if len(sys.argv) >= 2:
splitObfCode()
res_filename = sys.argv[1].split('.')[0]+"_decode.txt"
letsgo(obfCode, deobFunc, key)
else:
print "Usage: %s dadong_obfuscated_filename" % sys.argv[0]
if __name__ == "__main__" :
main()
