|
아래는 x module의 ttt 라는 함수에 대한 disassemble code이다. 아래를 보고 몇 가지 특징을 잡아 보자. x!ttt: 77f82f35 8b4c2408 mov ecx,dword ptr [esp+8] 77f82f39 8b442404 mov eax,dword ptr [esp+4] 77f82f3d 56 push esi 77f82f3e 668b11 mov dx,word ptr [ecx] 77f82f41 8d7002 lea esi,[eax+2] 77f82f44 668910 mov word ptr [eax],dx 77f82f47 eb08 jmp x!ttt+0x12 (77f82f51) x!ttt+0x19: 77f82f49 668b11 mov dx,word ptr [ecx] 77f82f4c 668916 mov word ptr [esi],dx 77f82f4f 46 inc esi 77f82f50 46 inc esi x!ttt+0x12: 77f82f51 41 inc ecx 77f82f52 41 inc ecx 77f82f53 6685d2 test dx,dx 77f82f56 75f1 jne x!ttt+0x19 (77f82f49) x!ttt+0x23: 77f82f58 5e pop esi 77f82f59 c3 ret 첫 번째는 jmp 에 의한 loop가 보인다. 상위의 노란색 block 이다. 일단, jmp 명령어에 의해서 77f82f51 로 분기한다. 그리고, jne 명령어에 의해서 77f82f49 로 분기될 수 있다. 결국, 아래 그림과 같이 looping이 된다. 77f82f47 -------> 77f82f51 -------> 77f82f56 ------+ ^ | | | +------77f82f49 <---------+ Loop에 대한 end 조건을 찾아보면, 녹색 Block 이다. 77f82f53 6685d2 test dx,dx 77f82f56 75f1 jne x!ttt+0x19 (77f82f49) test dx, dx 는 dx가 null여부를 Check 하는 알려진 명령어이다. test a,b 는 a&b와 같이 AND 연산을 의미한다. 그러므로, dx가 0x0이 아니면 결과가 0x0을 예상할 수 가 없다. 그 이후에 jne 연산을 하여 dx값이 0x0이 아닐 경우에 looping을 돌고, 0x0이면 해당 loop를 빠지는 condition으로 이뤄져 있음을 알 수 있다. 두 번째는 Frame 기반의 code가 아닌 듯 보인다. 이유는 assembly code 초기에 ebp(frame pointer) 저장 코드가 존재하지 않는 다. 또한, 초기 code를 보면, 77f82f35 8b4c2408 mov ecx,dword ptr [esp+8] 77f82f39 8b442404 mov eax,dword ptr [esp+4] Esp 기반의 data를 ecx, eax 로 전달하는 것으로 보이며, 이는 parameter의 assign 으로 보인다. 이는 kv command로도 확인된다. 이는 FPO 이다. ChildEBP RetAddr Args to Child 0006d950 0100e654 00d19fb0 0006e3b0 00c67fe0 x!ttt+0x1c (FPO: [2,0,1]) // 2는 parameters 0은 local variables 1은 cpu register (??) – push esi // 세 번째는 pointer 연산이 존재한다. 77f82f35 8b4c2408 mov ecx,dword ptr [esp+8] 77f82f39 8b442404 mov eax,dword ptr [esp+4] 77f82f3d 56 push esi 77f82f3e 668b11 mov dx,word ptr [ecx] 77f82f41 8d7002 lea esi,[eax+2] 77f82f44 668910 mov word ptr [eax],dx 상위의 노란 색을 보면, ecx 는 parameter로 전달된 address를 pointer로 갖고 있으며, 해당 pointer의 첫 번째 value 를 dx에 저장한다. 그리고, dx의 값을 eax address에 copy한다. Eax 역시 pointer이다. Debugging 할 때, 중요한 것은 data를 살피는 것인데, 상위의 code의 경우는 stack 에 존재하는 data를 유심히 살펴볼 필요가 있다. 만일, 아래의 위치에 break이 되어 있다고 가정하면, 77f82f4c 668916 mov word ptr [esi],dx 0:000> ddp esp 0006d950 00d19fb0 0042007b <---- esp 0006d954 0100e654 5914438b <---- esp+4 0006d958 00d19fb0 0042007b <---- esp+8 0006d95c 0006e3b0 0042007b <---- esp+c mov ecx,dword ptr[esp+8] 에서 해당 parameter의 처음 위치, 즉 parameter의 address는 어떻게 될까? 00d19fb0 가 아니고, esp+c, 0006e3b0 가 맞다. 이유는 중간에 push esi 라는 명령어가 존재하기 때문에 esp가 1 decrement 되었기 때문이다. 그러므로, esp+8, 00d19fb0 은 처음 eax에 mov된 parameter의 처음 address가 된다. Push/pop에 따라 esp가 변경되기 때문에 이를 유의하여 data를 check해야 한다. Loop block 안의 code는 아래와 같다. 77f82f49 668b11 mov dx,word ptr [ecx] 77f82f4c 668916 mov word ptr [esi],dx 77f82f4f 46 inc esi 77f82f50 46 inc esi x!ttt+0x12: 77f82f51 41 inc ecx 77f82f52 41 inc ecx 보면, ecx에서 esi로 dx register를 temp로 copy가 이뤄지고 있음을 알 수 있다. 그리고, inc가 두 번씩 발생하는 데, 이는 word 연산이기 때문에 그렇다. Word type data가 copy되고 pointer가 증가하기 때문에 각 pointer++은 inc 가 두 번 발생할 수 밖에 없다. 이는 아래의 명령어에서도 동일하게 추측된다. 77f82f3e 668b11 mov dx,word ptr [ecx] 77f82f41 8d7002 lea esi,[eax+2] 77f82f44 668910 mov word ptr [eax],dx lea 명령은 esi=eax+2 와 같은 pointer연산이라고 보면 되는 데, address를 +2했다는 것은 word type data를 dx에 copy 하고, 그 다음 word에 위치시키기 위해서, 즉 word 연산이기 때문에 +2가 된다는 것을 알 수 있다. 그러므로, 해당 function은 2개의 pointer를 source와 destination으로 받아서 copy하는 operation으로 보인다. 그리고, source data가 0x0일 때까지 copy가 이뤄지는 구조로 이해할 수 있다. //참고로 … Jump 명령어는 Condition code flag와 연관이 있다. X86에서 Condition code flag는 다음과 같다.
그러므로, jump 명령어는 수행 시 condition code flag가 어떤 값인지를 Check하는 것이 중요한데, 이러한 Flag 정보는 Dump상 register 를 보는 ‘r’ 명령에서 확인할 수 있다. 예를 들어, 아래의 녹색 block은 flag에 대한 정보를 보여준다. 0:000> r eax=00d19fb0 ebx=00c67fe0 ecx=0006e400 edx=007a007d esi=00d1a000 edi=00c67fe0 eip=77f82f4c esp=0006d950 ebp=0006d96c iopl=0 nv up ei pl nz na po nc cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00010202 x!ttt+0x1c: 77f82f4c 668916 mov word ptr [esi],dx 마치 기호로 되어 있는 듯 하지만, 다음과 같은 의미를 갖고 있다. The following table lists the x86 flags:
|
카테고리
이글루링크
최근 등록된 덧글
그러세요
by 강세윤 at 12/15 오늘 많이 헤매다..알게 .. by youna at 12/14 글 잘 읽었습니다 . 전 .. by 위시 at 11/26 어렷다 by klhk at 11/09 dhjjgbem by kl at 11/09 17번부터 어떻게 접는지.. by tykim0131 at 10/28 ATL이나 MFC를 이용하.. by 김명신 at 09/24 복원되었군요.. 제 RSS.. by 강세윤 at 09/24 허걱, 하고 있는 것으로.. by 강세윤 at 09/15 RSS 주소 서비스는 안 .. by 정성태 at 09/15 이글루 파인더
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||