본문 바로가기
Programming/Hacking & Security

[Reversing] 기본 연산(mov, push, pop) By 용호

by ★용호★ 2010. 5. 14.


2010년 5월 11일 화요일

PUSH : 스택에 값을 저장
POP : 스택의 가장 최근 값을 빼고 인자에 대입
MOV : 두번째 인자의 값을 첫번째 인자에 대입


현재 EAX를 PUSH한 상태이므로 스택에 EAX값이 들어갔다. EAX값은 10… 그 다음 EBX를 POP하는데 나는 EBX를 PUSH한적이 없는데 어떻게 POP을 할까 라는 생각을 했었는데 개념을 잘못 생각하고 있었다. POP을 한다는것은 현재 스택에 가장 위에 있는 데이터를 꺼내서 대입한다는 의미였다. 그러므로 POP을 하면 위에서 PUSH한 EAX값 10을 EBX에 대입한다는 의미이다.


다음과 같이 POP을 했더니 EBX에는 EAX값 10이 들어간 것을 확인할 수 있다.



여기서는 EAX에 0을 넣고 0B값을 AH에 넣어준다. AH는 EAX(32bit)에서 8~15bit의 범위이므로 0B값을 그 자리에 넣어준다. 아래의 레지스터 값은 한자리당 4bit의 숫자이므로 끝에서 4번째 5번째 자리에 0B값이 들어가게 된다.





Mov al, 101h에 주석 처리를 했는데 al은 8bit 이지만 16진수 101은 12bit가 된다. 그렇기 때문에 al에 범위를 초과하는 101h 값이 들어갈 수가 없다.


컴파일을 하려고 하면 다음과 같이 에러를 표시한다.



MOVZX : 남은 공간은 모두 0으로 채움
 현재 AX에는 1234 값이 들어가 있다.  여기서 MOVZX를 이용하여 AX값을 EBX에 넣는데 MOV를 했을 경우 EBX값은 7FFD1234가 되었을 것이다. 하지만...



아래와 같이 0001234가 들어간 것을 볼 수 있다.



MOVSX : Source operand의 사이즈가 destination operand의 사이즈보다 작은 경우 사용
음수인 경우 MOVSX를 사용해야 하며 값이 FFFFA988로 들어 간 것을 볼 수 있다.






댓글