if-else structure

PUSH EBP
MOV EBP,ESP  
-------------------> stack bp , sp 자리잡기


SUB ESP,4C
-------------------> 4C(hex) 만큼 stack 에 자리확보 

PUSH EBX
PUSH ESI
PUSH EDI
-------------------> 기존의  값을 보존하기 위해 스택에 삽입


LEA EDI,DWORD PTR SS:[EBP-4C]
---------------------------------------> ebp-4C 의 4byte 주소를 edi 로 삽입 

MOV ECX,13
MOV EAX,CCCCCCCC
REP STOS DWORD PTR ES:[EDI]
---------------------------------------> 4C(hex) 만큼  ecx 로 루프를 돌리면서
                                                           이전에 삽입해 놓은 edi(ebp-4c의 주소)부터
                                                           edi 를 4byte ++ 시키면서 스택을 0CCCCCCCCh
                                                           로 예외처리를 하기 위해 초기화

MOV DWORD PTR SS:[EBP-4],3
---------------------------------------> ebp-4 의 자리에 3를 move 시킨다.
MOV DWORD PTR SS:[EBP-8],5
---------------------------------------> ebp-8 의 자리에 5를 move 시킨다.


* if - else  문의 structure  *

---------------------------------------------------> if start.
00401036          MOV EAX,DWORD PTR SS:[EBP-4]
00401039          CMP EAX,DWORD PTR SS:[EBP-8]
0040103C          JE SHORT ifelse.00401049                  ; conditional jump to else
0040103E          MOV ECX,DWORD PTR SS:[EBP-4]
00401041          ADD ECX,DWORD PTR SS:[EBP-8]
00401044          MOV DWORD PTR SS:[EBP-C],ECX
00401047          JMP SHORT ifelse.00401052              ; unconditional jump
 
--------------------------------------------------> if end.

--------------------------------------------------> else start.
00401049          MOV EDX,DWORD PTR SS:[EBP-4]
0040104C         SUB EDX,DWORD PTR SS:[EBP-8]
0040104F          MOV DWORD PTR SS:[EBP-C],EDX
--------------------------------------------------> else end.

00401052          MOV EAX,DWORD PTR SS:[EBP-C]
00401055          PUSH EAX                               
00401056          PUSH OFFSET ifelse.??_C@_0M@GFOO@total?5>
"

CALL ifelse.printf                  
ADD ESP,8
XOR EAX,EAX
POP EDI
POP ESI
POP EBX
ADD ESP,4C
CMP EBP,ESP
CALL ifelse.__chkesp
MOV ESP,EBP
POP EBP

RETN

리버싱중에  conditional jump문 안에서 앞의 주소로 건너뛰는 unconditional jump(jmp) 문을 발견한다면,,
그것은 아마도 if - else 문을 것이다.
위에서 보는봐와 같이,,  else 문의 다음의 주소는  if 문의 끝에 위치한 jmp 되어질 주소와 같다.
이로써  jmp statement를 가지고 있는 블락은 if 문이 되고 jmp문 뒤에는 else 문이 되는 것을 알 수 있다.

by codexb | 2006/05/08 09:14 | [x86]assem | 트랙백(1) | 덧글(2)

트랙백 주소 : http://leony.egloos.com/tb/1928680
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from at 2014/03/11 00:27

제목 : garcinia cambogia extract
line2...more

Commented by 미친감자 at 2006/05/09 09:46
좋네요..LEA EDI,DWORD PTR SS:[EBP-4C] 스택을 확보하기 위한 거였군요..

Commented by fullc0de at 2006/05/09 10:49
미친감자님.. 스택 확보는 SUB ESP,4C <-- 요 구문인거 같은데요..
LEA EDI,DWORD PTR SS:[EBP-4C]는 Stack Segment에서 EBP-4C위치에 있는 메모리 주소값을 EDI에 넣어주는 것 같습니다.

◀ 이전 페이지          다음 페이지 ▶