2006년 05월 08일
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 문이 되는 것을 알 수 있다.
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 | 2006/05/08 09:14 | [x86]assem | 트랙백 | 덧글(2)





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
LEA EDI,DWORD PTR SS:[EBP-4C]는 Stack Segment에서 EBP-4C위치에 있는 메모리 주소값을 EDI에 넣어주는 것 같습니다.