payload obfuscation
페이로드를 그냥 raw로 저장하면 분명 백신에 걸릴 것이다...
이때 사용하는 것이 바로 페이로드 난독화다!
저장은 난독화를 하고 메모리에 virtualAlloc등으로 메모리에 올리기 직전에 난독화를 해제해 페이로드를 돌린다!
release 모드로 컴파일하기!
I
Pv4 / IPv6 난독화
셸코드의 바이트를 IPv4 / IPv6 문자열로 바꾸는 방법
- IPv4 난독화: 각 바이트를 10진수로 바꿔 4바이트씩 인코딩하기
(따라서 패딩으로 4바이트의 배수가 되게 페이로드를 조정)
예) FC 48 83 E4 를 IPv4 인코딩
252.72.131.228 - IPv4 난독화 해제:
NTAPI의Rtllpv4StringToAddressA를 통해 IPv4 -> byte으로 바꿀 수 있다
https://learn.microsoft.com/ko-kr/windows/win32/api/ip2string/nf-ip2string-rtlipv4stringtoaddressa
- IPv6 난독화: 10진수 변환 없이 16바이트를 바로 IPv6 형태로 변환
(따라서 패딩으로 16바이트의 배수가 되게 페이로드를 조정)
예) FC 48 83 E4 00 12 C8 00 00 00 AB DC 18 39 2E 44 를 IPv6 인코딩
FC48:83E4:0012:C800:0000:ABDC:1839:2E44 - IPv6 난독화 해제:
NTAPI의Rtllpv6StringToAddressA를 통해 IPv6 -> byte으로 바꿀 수 있다
MAC 난독화
셸코드의 바이트를 MAC 주소로 바꾸는 방법
- MAC 난독화: 10진수 변환 없이 6바이트를 바로 MAC 형태로 변환
(따라서 패딩으로 6바이트의 배수가 되게 페이로드를 조정)
예) FC 48 83 E4 00 12 를 MAC 인코딩
FC-48-83-E4-00-12 - MAC 난독화 해제:
NTAPI의RtlEthernetStringToAddressA를 통해 MAC -> byte로 바꿀 수 있다
UUID 난독화
셸코드으 바이트를 UUID 형식으로 바꾸는 방법
550e8400 - e29b - 41d4 - a716 - 446655440000
time_low - time_mid - time_hi&version - clock__seq_hi&res_clock_seq_low - node
- UUID 난독화: 10진수 변환 없이 UUID 구조에 따라 변환
단, 첫 3개의 세그먼트는 리틀 엔디안 때문에 순서가 반대로 뒤집힌다는 것을 주의!!
예) FC 48 83 E4 00 12 C8 00 00 00 AB DC 18 39 2E 44 를 UUID 인코딩
E48348FC-1200-00C8-0000-ABDC18392E44 - UUID 난독화 해제:
WINAPI의UuidFromStringA를 통해 UUID -> byte로 바꿀 수 있다
Hellshell
이런걸 다 모아놓은 도구가 있다!
https://github.com/NUL0x4C/HellShell/tree/main?tab=readme-ov-file
git clone을 하고 .sln파일에서 release mode로 컴파일해서 나온 .exe 파일을 사용하면 된다

const char* IPv4Shell[] = {
"105.39.109.32", "99.111.111.107", "101.100.144.144"
};
#define ElementsNumber 3
#define SizeOfShellcode 12
BOOL DecodeIPv4Fuscation(const char* IPV4[], PVOID LpBaseAddress) {
PCSTR Terminator = NULL;
PVOID LpBaseAddress2 = NULL;
NTSTATUS STATUS;
int i = 0;
for (int j = 0; j < ElementsNumber; j++) {
LpBaseAddress2 = PVOID((ULONG_PTR)LpBaseAddress + i);
STATUS = RtlIpv4StringToAddressA((PCSTR)IPV4[j], FALSE, &Terminator, (in_addr*)LpBaseAddress2);
if (!NT_SUCCESS(STATUS)) {
printf("[!] RtlIpv6StringToAddressA failed for %s result %x", IPV4[j], STATUS);
return FALSE;
}
else {
i = i + 4;
}
}
return TRUE;
}
실제로 돌려보면 이런 cpp파일을 내보낸다.

내부에 들어있는 DecodeIPv4Fuscation를 통해 풀어보면 내가 메모장에 입력한 내용이 잘 들어있는 것을 알 수 있다.
.txt 말고도 페이로드 그 자체인 .bin 형식도 가능하다.
반응형
'악성코드와 백신 > 악성코드 개발일지' 카테고리의 다른 글
| [악성코드 개발](10)[local-payload-injection] (0) | 2026.03.12 |
|---|---|
| [악성코드 개발](9)[페이로드 암호화] (0) | 2026.03.11 |
| [악성코드 개발](7)[metasploit] (0) | 2026.03.09 |
| [악성코드 개발](6)[페이로드 저장] (0) | 2026.03.06 |
| [악성코드 개발](5)[Windows process & thread] (0) | 2026.03.02 |