본문 바로가기
.study/pwnable

[포너블 기초] Egg Shell, NX-Bit

by Carry_on 2023. 10. 23.

Egg Shell

EggShell이란?

스택내에 셸코드 저장 불가 시, 환경변수 내에 셸코드를 저장 후, 환경변수의 주소 값으로 eip를 이동시켜 셸 코드를 실행하는 기법이다.

 

export 변수명=`python -c 'print "\x90"*100+"셸코드를 통해 환경변수에 셸코드를 저장한 이후

c언어의 getenv 함수를 이용하여 환경변수가 저장된 주소를 얻을 수 있고,

RET주소에 getenv 함수를 통해 얻은 주소를 덮어씌우면 셸코드를 실행 할 수 있다.

 

 

Nop Sled

NOP은 어셈블리 명령어로, 아무것도 하지 않는 No Operation의 약자이다.

 

NOP Sled를 직역하면 NOP 썰매로, 이는 NOP을 타고 쭉 미끄러져 셸코드까지 도달하는 것을 말한다.

원래의 NOP 역할은 기계어 코드가 다른 기계어 코드와 섞이지 않도록 하는 것이다.

 

셸코드의 주소를 정확히 알기 힘들 경우 셸코드 앞에 충분한 양의 NOP을 넣어주고 ret에 적절한 NOP 주소를 넣어주면 NOP 명령이 쭉 미끄러지듯이 실행되어 shellcode를 만나면 실행시킬 수 있다.

 

x86에서 nop 명령어의 바이트 코드는 0x90이다.

 

nop sled

이 그림에서 0xbffffa30~0xbffffa4c 사이의 값을 ret에 대입하면 EIPnop(0x90)을 만나
바이트씩 증가하다가 셸 코드의 시작 주소인 0xbffffa4c로 자동으로 이동하고, 셸 코드가 실행된다.

 

NX-Bit

NX-Bit(Never eXecute bit, 실행 방지 비트)는 프로세서 명령어나 코드

또는 데이터 저장을 위한 메모리 영역을 따로 분리하는 CPU의 기술이다.

일반적인 프로그램에서의 스택 메모리는 코드를 실행하는 용도로 사용되는 것이 아니라,

일시적으로 데이터를 읽고 쓰는데 사용되기 때문에 실행 권한이 필요 없다.

이러한 이유로 프로그램의 공격을 어렵게 하기 위해,

메모리에 쓰기 권한실행 권한을 동시에 부여하지 않는 NX bit가 등장하였다.