본문 바로가기
Reversing/Reversing

C코드->어셈코드 분석 [if, for, while]

by bbolmin 2012. 7. 28.

 

 

어셈코드에 익숙해지기 위해서 c언어에서 if, for, while을 컴파일한 후 ollydbg로 어셈코드 형태를 알아보겠습니다.

 

 

1. if문

 

 

 

 

 

위와 같은 형태를 볼 수 있습니다.

 

 

즉 if문은 (조건 분기) - 연산 수행 - (무조건 분기) - 연산 수행 의 형태를 가집니다.

[else 없이 if하나만 사용한다면 (조건 분기) - 연산 수행이 되겠죠]

 

 

 

 

 

2. for문

 

 

 어셈 코드를 보기 전에 for문의 동작을 먼저 생각해보면,

1. i=0 - 비교(i<5)- 연산(sum+=i)

2. i++ - 비교(i<5)- 연산(sum+=i)

이렇게 2가지로 나누어 볼 수 있습니다.

1번 과정은 1번 수행되고 2번 과정은 for문의 반복회수에 맞게 여러번 수행되겠죠. 여기서 비교, 연산 부분은 1, 2번 모두 같으므로 이것을 합쳐서 표현하면 아래와 같습니다.

 

for문 어셈코드도 이런 형태로 나오게 됩니다. (여기서의 화살표는 무조건분기(jmp)입니다. 그리고 비교 부분에서 아래 연산을 수행할지 아니면 다른 곳으로 조건분기하여 for문을 종료할지 결정하는 것이죠.)

 

 

어셈코드로 확인해보면 동일한 형태임을 알 수 있습니다.

 

여기서 주소부분을 안찍어서;; 아래 그림 추가.(JMP, JGE, JMP 보기)

 

 

 

그럼 for문은 아래 처럼 초기화 - 증감 - 비교 - 연산수행 과정이 있으므로 무조건 분기(JMP), 조건분기, 무조건 분기(JMP)가 있을 것 입니다.

 

 

 

 

3. while문

 

 

 

 

 

 

if, for문과 비슷하므로 간단하게 알아보면 (조건 분기) - 연산 수행 - (무조건 분기)가 있다는 것을 볼 수 있습니다.

 

 

 

 

 

마지막으로 정리해보면

 

if문 : 조건 분기(아래로) - 무조건 분기(아래로)

 

for문 : 무조건 분기(아래로) - 조건분기(아래로) - 무조건 분기(위로) 

 

while문 : 조건 분기(아래로) - 무조건 분기(위로)

 

 

 

 

 

'Reversing > Reversing' 카테고리의 다른 글

함수 호출 규약  (1) 2012.10.16
Windbg 명령어 요약  (0) 2012.10.13
혼동되는 어셈블리 명령어  (2) 2012.10.07
어셈블리어의 주소 지정 방식  (0) 2012.09.10
upx 언패킹하기 - MUP(Manual UnPacking)  (4) 2012.07.12