일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 포인터
- Win32
- Javascript
- 티스토리
- 연산자
- VS ERROR
- Desktop
- c
- Kotlin
- 리뷰
- 함수
- c++
- 배열
- 지식나눔강좌
- 문법
- tipssoft
- Tips프로그래밍강좌
- Visual Studio
- Direct2D
- Tips강좌
- Windows
- 이지스퍼블리싱
- 김성엽
- 프로그래밍
- CS
- 알고리즘
- c#
- Programming
- 백준
- doit코틀린프로그래밍
Archives
- Yesterday
- Today
- Total
F.R.I.D.A.Y.
[C300] : C001 본문
반응형
#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