-
shellcode 작성 시 null byte 제거하기ETC/Pwn 메모장 2019. 6. 20. 23:22
기본적으로 shellcode 작성 시에는 null byte를 없애는 것이 최우선 목표이다.
mov eax, 0x0
이러한 코드는 다음과 같이 기계어로 번역된다.
b8 00 00 00 00 mov eax,0x0
이렇게 되면 shellcode로 넣을 때에 "\xB8\x00\x00\x00\x00" 이런 식으로 들어가게 되는데 만약 strcpy로 shellcode를 삽입할 시에 \x00(Null Byte) 에서 끊기므로 우리는 저 Null Byte를 없애줘야 한다.
몇가지 방법이 있는데 하나하나 살펴보자.
1. xor를 이용한 레지스터 초기화
xor eax, eax
xor 연산을 똑같은 레지스터와 하게 되면 그 레지스터는 0x0으로 초기화 된다. 이 asm code를 기계어로 번역해보자.
31 c0 xor eax,eax
위의 mov연산을 통해 레지스터 초기화할때 보다 Byte수가 줄어들었고, (5->2) Null Byte가 없어졌다.
2. cdq 명령을 통한 edx 레지스터 초기화
cdq 명령어란? eax레지스터가 양수일 경우 edx레지스터는 0x0으로 초기화 하고, eax레지스터가 음수일 경우 edx레지스터는 0xffffffff으로 초기화 하는 단일 바이트 명령이다.
그러므로, eax레지스터를 양수로 초기화 시키고, edx레지스터를 양수로 초기화 시킬 경우에 xor 명령어를 사용하여 초기화도 가능하지만, cdq명령을 통하여 1byte를 줄일 수 있고 또한 Null Byte까지 제거가 가능하다.
xor eax, eax xor edx, edx xor eax, eax cdq
위 명령어를 기계어로 번역해보자.
31 c0 xor eax,eax 31 d2 xor edx,edx 31 c0 xor eax,eax 99 cdq
참고문헌
https://www.lazenca.net/pages/viewpage.action?pageId=12190056
'ETC > Pwn 메모장' 카테고리의 다른 글
shellcraft에서 64bit shellcode 에러 (0) 2019.06.24 반복문에서 쉘코드 크기 줄이기 (0) 2019.06.24 Double Free buggggggg (0) 2019.06.14 python code debugging (0) 2019.06.14 ARM에서 PC 레지스터가 낳은 의문점 (0) 2019.06.11