NOP
명령 주소를 정렬하는 데 종종 시간 이 사용됩니다. 버퍼 오버플로 또는 형식 문자열 취약점 을 악용하기 위해 Shellcode 를 작성할 때 일반적으로 발생 합니다 .
상대가 100 바이트 앞으로 이동하고 코드를 약간 수정했다고 가정 해보십시오. 수정 사항이 점프 대상의 주소를 엉망으로 만들 수 있습니다. 따라서 위에서 언급 한 상대 점프도 변경해야합니다. 여기에서을 추가 NOP
하여 대상 주소를 전달할 수 있습니다. NOP
대상 주소와 점프 명령 사이에 s 가 여러 개인 경우 NOP
s를 제거 하여 대상 주소를 뒤로 당길 수 있습니다 .
레이블을 지원하는 어셈블러를 사용하는 경우에는 문제가되지 않습니다. JXX someLabel
JXX가 조건부 점프 인 경우 간단하게 수행 할 수 있으며 어셈블러가 someLabel
해당 레이블의 주소로 대체합니다 . 그러나 수동으로 조립 된 기계어 코드 (실제 opcode)를 손으로 수정하는 경우 (쉘 코드 작성과 함께 발생하는 경우) 점프 명령을 수동으로 변경해야합니다. 수정하거나 NOP
s 를 사용하여 대상 코드 주소를 이동하십시오 .
NOP
명령어의 또 다른 유스 케이스 는 NOP sled 입니다. 본질적으로 아이디어는 부작용을 일으키지 않는 충분히 큰 명령 배열을 만드는 것입니다.NOP
또는 레지스터를 증가시킨 다음 감소시키는 것) 명령 포인터를 증가시킵니다. 예를 들어 주소를 알 수없는 특정 코드로 이동하려는 경우에 유용합니다. 요령은 상기 NOP 슬 레드를 목표 코드 앞에 놓고 상기 슬 레드 어딘가에 점프하는 것이다. 결과는 부작용이없는 배열에서 실행이 계속되기를 희망하며 원하는 코드 조각에 부딪 칠 때까지 명령 당 명령을 순회합니다. 이 기술은 앞에서 언급 한 버퍼 오버플로 악용 및 특히 ASLR 과 같은 보안 조치에 대응하는 데 일반적으로 사용됩니다 .
NOP
명령에 대한 또 다른 특정 용도 는 일부 프로그램의 코드를 수정하는 경우입니다. 예를 들어 조건부 점프의 일부를 NOP
s로 바꾸어 조건을 우회 할 수 있습니다. 이것은 소프트웨어의 복사 방지를 " 크래킹 " 할 때 자주 사용되는 방법 입니다. 가장 간단한 방법 if(genuineCopy) ...
은 코드 라인에 대한 어셈블리 코드 구문을 제거 하고 명령어를 NOP
s 및 ..로 대체하는 것입니다 . 점검이없고 비정품 복사가 작동합니다!
본질적으로 쉘 코드와 크래킹의 두 가지 예는 동일합니다. 상대 주소 지정에 의존하는 작업의 상대 주소를 업데이트하지 않고 기존 코드를 수정합니다.