본문 바로가기
Programming/Hacking & Security

[Reversing] MUL, DIV By 용호

by ★용호★ 2010. 5. 21.


2010년 5월 12일

중간 점검 문제

1. 스택프레임설정
2. 지역변수 설정(4byte, 4byte, 8byte 3개의 지역변수)
3. 첫번째 지역변수(4byte)에 31323334h를 넣는다.
4. 두번째 지역변수(4byte)에 35363738h를 넣는다.
5. 첫번째 지역변수의 값 전체를 movsb를 사용하여서 3번째 지역변수에 넣는다.
6. 3번째 지역변수의 5를 실행하고 남은 공간에 두번째 지역변수의 값을 movsw를 사용하여서 넣는다.
7. 스택프레임 정리



Edi 값은 자동으로 다음 주소를 가르키므로 두번째에서는 이미 edi가 다음 주소값을 가지고 있으므로 지정해줄 필요가 없다. 
Esi는 지정해주지 않으면 해당 edi에 주소값이 들어가게 된다.






1. Eax에 16진수 1234을 저장
2-1. BX에 8진수 1234을 저장
2-2. BX의 값을 EDI에 저장(부호없이 확장)
3. ECX에 10진수 1234를 저장
4. EAX와 EBX를 더해서 결과값을 EAX에 저장
5. EAX에서 ECX를 뺀 결과 값을 EAX에 저장





Mul bl을 하면 AL * BL = AX
(8bit * 8bit는 8bit보다 큰 값이 나오므로 AX에 저장)
MUL과 IMUL의 차이는 unsign이냐 sign이냐의 차이다.



Mul bx를 하면 Ax * Bx = DX : AX
(계산값이 AX값 보다 클 경우 초과된 값이 DX에 저장되고 나머지는 AX에 저장)




Mul ebx를 하면 EAX * EBX = EDX : EAX
(결과값이 4byte를 넘어가므로 EAX에 저장하기엔 값이 크므로 초과된 값이 EDX에 저장된다)





아래의 주석을 풀면 수행이 되지 않는 이유는 cdq 를 했다는 것은 sign으로 연산 하겠다는 것인데
div는 unsign 연산이므로 근본적으로 안되는 코드이다.



Div cl을 하면 al/cl = al(몫) ah(나머지)
Cbw는 al을 ax로 확장
Cbq는 dx까지 확장



여기서 83은 16진수, 10진수로 고치면 125
16진수 10은 10진수로 16
나누면 몫은 7, 나머지는 13
2의 보수 취하면 몫은 F9, 나머지는 F3이 된다.

Div cx를 하면 dx:ax/cx = ax(몫) dx(나머지)




나눌때는 ax와 dx를 같이 본다. 그러므로 dx를 확장을 하든 0으로 만들어줘야 한다.
아래와 같이 EDX값에 1을 넣고 계산을 해보겠다.



그러면 7023/100이었는데 DX의 값 때문에 몫이 170이 되고 나머지가 100이 된걸 볼 수 있다.



 

Div ecx 하면 Edx:Eax/ecx = eax() edx(나머지)




▶ 코드파일


댓글