F.R.I.D.A.Y.

[C300] : C001 본문

리버싱/C300

[C300] : C001

F.R.I.D.A.Y. 2018. 9. 22. 19:51
반응형


#include <stdio.h> 

main() 
{ 
	printf( "오늘부터 나는 C 프로그래머!" );
} 


 위 코드를 IDA로 분석하면 아래와 같은 ASM이 나온다.



 이 코드를 역분석 하는 것이 C001의 문제이다.


 offset _Format에서 offset은 명령어로 다음 기능을 수행한다.

 offset

>> 전역 변수의 주소를 구한다.


 여기서 _printf 아래의 두줄은 주석의 설명과 같다.

add esp, 4        ; esp값을 4를 더하고 (즉, 프로그램 시작의 bp를 지운다. )

xor eax, eax      ; eax를 xor을 해서 0으로 바꾼다.


 따라서 프로그램 코드를 작성할 당시 전역 변수가 저장된 주소를 찾아준 후, 스택에 쌓는 작업을 [401010]이 작업한다고 볼 수 있다.

이후, _printf를 실행하므로 기본 구조는 아래와 같다.



#include <stdio.h>

int main(void){
    printf(_Format);

    return 0;
}


 여기서 _Format 을 더블클릭하면 _Format이 가리키는 주소로 이동할 수 있다.




 메모리 주소 [4020F0]부터 [40210B]까지를 블럭지어 오른쪽 마우스로 클릭하면


 컨텍스트 박스에 해당 메모리 값이 가지는 문자열을 표시해준다.

 따라서 위 내용을 종합하면 의사코드는 아래와 같다.



#include <stdio.h> 

int main(void ) 
{ 
	printf( "오늘부터 나는 C 프로그래머!" );

	return 0;
} 



참고

>> printf에 바로 입력되거나 코드상에서 변수에 할당하는 문자열을 포함한 데이터들은 프로그램상의 데이터세그먼트 영역에 보관된다. 이 영역은 전역이기 때문에 전역 주소를 구하는 offset을 사용하는 것.

>> 코드상 retn이후 뒤에 값이 없기 때문에 0으로 취급해 의사코드에 반환형을 int, 반환값을 0으로 준것이다.

728x90
반응형

'리버싱 > C300' 카테고리의 다른 글

[C300] : C004  (0) 2018.09.28
[C300] : C003  (0) 2018.09.25
[C300] : C002  (0) 2018.09.23
Comments