posted by 블르샤이닝 2014. 11. 7. 16:57
728x90

완전 쉬운 nspack....이걸 써야할지 말아야할지 생각도 안하고 ..그냥 올려본다..


해당 특징이라하면 특정 어셈 명령어에 대한 지식을 알면 쉽게 이해 할수 있다.


누구나 아는 upx에서 pushad 의 어셈명령이 무엇인지 기억하는가? 모든 레지스터에 대한 값을 저장하는것이였다.


여기서는 pushfd를 쓴다. PUSHFD 는 'push flags double-word' 의 약어로, 플래그를 

더블워드로 스택에 넣는다.[ 출처 : http://gnudevel.tistory.com/404]
간단히 말해서 기능을 비슷하다. 

------------------------------------------------------------------------------------

pushad 명령어

- 레지스터를 한꺼번에 저장하는 명령어이다.

한꺼번에 저장되는 순서

EAX->ECX->EDX->EBX->ESP->EBP->ESI->EDI

이 순서대로 stack에 저장된다.


실습)

ESP자리에는 pushad 하기 전 ESP 주소값이 대입된다.



popad

- 레지스터의 값을 한꺼번에 들고오는 명령어

레지스터 들고오는 순서
EDI->ESI->EBP->EBX->EDX->ECX->EAX

* ESP는 들고 오지 않는다.

실습)



pushfd

- 플레그값을 저장하는 명령어

실습

- stack에 EFL 값 대입



popfd

- 플레그값을 들고오는 명령어

실습)

popfd 하기 전 EFL 값



popfd 한후 EFL값

- stack에 있던 값을 들고와 EFL에 대입


출처 : http://index2014.tistory.com/126



-----------------------------------------------------------------------------


자 여기까지가 이 팩에 대한 알아야할 기본 지식이다. 이 팩에서는 pushfd, pushad를 연속으로 씀으로써 플래그값 및 레지스터 정보를 다 저장하였다가 언팩하여 jmp 할때 해당 레지스터값을 복원하여 동작한다. 

nspack 확인


nspack에서 ep부분에 보이는 pushfd와 pushad 값을 확인할 수 있다. 

아래 보면 popad, popfd 후에 jmp를 하는것을 알 수 있다.


참고로 보면알겠지만 그냥 ctrl+f 눌러서 popfd하면 바로 나온다;; jmp에 bp걸고 ㄱㄱ 하면 끝 


이상 매우 쉬운 nsunpack에 대한 확인 및 언팩이였다....너무쉽다ㅣ

728x90