일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- c#
- 지식나눔강좌
- Programming
- Javascript
- Windows
- 연산자
- Direct2D
- Kotlin
- Desktop
- 이지스퍼블리싱
- 김성엽
- 알고리즘
- 함수
- 배열
- 백준
- tipssoft
- c++
- Tips강좌
- Visual Studio
- 문법
- VS ERROR
- 티스토리
- 리뷰
- Win32
- doit코틀린프로그래밍
- CS
- c
- 포인터
- 프로그래밍
- Tips프로그래밍강좌
- Yesterday
- Today
- Total
목록리버싱/C300 (4)
F.R.I.D.A.Y.
#include main() { int x; int y; x = 10; y = x - 5; if( x > y ) { printf( "x의 값이 y보다 큽니다." ); } else { printf( "x의 값이 y보다 작습니다." ); } } 위 코드를 분석한다. 처음 IDA에 올리면 아래 코드가 나온다. 보면, 분기구문이 있으므로, if문이 있다고 보여진다. 코드를 보면 일단, 10과 5를 넣는것을 알 수 있다. (실수로 [401093]까지 블럭을 씌워야 하는데, 못했다. 귀찮아서 수정은 안함) 이 코드에서 ecx 레지스터와 스택에 들어있는 값을 비교한다. 즉, 스택에 들어있는 10과 5를 비교한다고 볼 수 있다. cmp 명령어는 결과가 -가 나오면 CF가 1로, 0이면 ZF가 1로 설정된다. 따라서 일..
#include #define X 1 #define PI 3.141592 main() { double z; z = X + PI; printf( "%f", z ); } 위 코드를 분석한다. IDA로 돌리면 아래와 같은 코드가 나온다. var_8의 경우에는 IDA가 분석을 실행하며 발생하는 IDA 변수로 바라볼 수 있다. movsd 명령어는 DWORD 기준으로 복사를 시행한다. mov 명령어로도 충분이 이동이 가능하지만, CPU에 존재하는 명령어를 통해 속도를 최적화하기 위해 사용한다. xmm0은 CPU상에 128bit의 레지스터를 의미한다. 자세한 내용은 다음 참고. 이렇게 데이터를 처리하는 이유은 현재 컴퓨터에서 정수의 저장방식과 실수를 저장할 때 사용하는 부동소수점의 저장방식에 차이가 있기 때문이다. ..
#include main() { int x; int y; int z; x = 1; y = 2; z = x + y; printf( "%d", z ); } 이번엔 위 코드를 분석한다. IDA로 돌리면 아래 이미지와 같은 화면이 나온다. push 3push offset _Format 이 두 줄의 코드로 3과 _Format이 가리키는 주소를 스택에 쌓는다. 그러면 스택에는 아래 이미지와 같이 데이터가 쌓이게 된다. 이후 _printf 함수가 호출된다.add esp, 8xor eax, eax 두 줄의 코드를 통해 호출한 함수를 정리한다. 이제 간단히 의사 코드를 작성하면 아래와 같아진다. #include int main(void){ printf(_Format, 3); return 0; } _Format은 C001..
#include 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를 실행하므로 기본 구조는 ..