본문 바로가기

전체 글722

[Reversing] 반복문의 동작 원리 by 용호 2010년 5월 25일 화요일 401025 부분이 반복되는 부분 다음 구문은 무한 루프의 while을 나타낸다. (while(1)) 아래 처음 cmp부분은 if문을 나타낸다. 이어서 아래에 또다시 cmp가 나오는데 else if 일까 아니면 새로 시작하는 if 일까?, 새로시작하는 if 구문이다. 이유는 만약 else if 또는 else 라면 jmp 되는 곳이 같아야 한다. 하지만 위에선 401020으로 jmp를 하고 아래에선 401050으로 jmp를 수행한다. 다음과 같이 위의 if문에서 jmp되는 곳과 아래의 조건의 jmp되는 곳이 같으므로 401050부분은 Else if 문을 의미한다. 여기서 조건이 두개라는 것은 if 문 안의 if 이거나 and(&&), or(||) 연산자를 이용한 조건이라는 의.. 2010. 5. 26.
[Reversing] switch, if, while, do~while 동작원리 by 용호 2010년 5월 24일 월요일 지역변수를 두개를 할당한 이유는 switch문에서 비교를 위한 변수가 하나 필요하기 때문이다. 아래의 부분에서 비교를 위한 공간을 사용한다. If문은 cmp와 jmp를 반대로 수행한다. 아래의 경우 cmp로 a와 0을 비교하는데 조건이 0보다 크거나 같은 경우이다. 이렇게 되면 if문은 그의 반대인 if(a 2010. 5. 25.
[Reversing] C언어로 작성된 코드 분석 By 용호 2010년 5월 20일 목요일 C언어로 작성된 코드(.c파일)를 컴파일하기 위해 비쥬얼 스튜디오의 CLI환경을 이용한다. CLI 환경에서 "Cl 파일명.c /link /debug /opt:icf" 명령을 수행하면 컴파일 된다. 코드를 분석하기 위해 Olldbg 툴보다는 IDA가 편하기 때문에 이제부터는 IDA 프로그램을 사용한다. ▶ 프로그램 Stdcall은 callee 방식이므로 retn 8 을 해주는데 여기서 8은 스택에 공간을 할당한 크기이고, Retn 8을 해주면 자동으로 ebp+8이 된다. Cdecl 을 할때는 eax, ecx에 값을 넣어 push를 해주고 stdcall을 할때는 edx, eax에 값을 넣어 Push를 해주는데 이것은 크게 상관이 없다. 범용 레지스터이므로 어디에 값을 넣어도 상.. 2010. 5. 21.
[Reversing] Call, Jmp By 용호 2010년 5월 18일 화요일 Call과 Jmp는 프로그램의 흐름을 변경할 수 있는 명령어, 즉 , EIP값을 변경하는 명령어이다. 두 명령어의 차이점은 RET의 유무이며 Call에는 RET가 있고 Jmp에는 없다. Jmp는 단독으로 수행되는 경우는 드물고 cmp(sub연산)와 test(and연산) 명령 이후에 사용된다. #차이점 1. Call은 EIP 값을 변경하기 전에 스택에 백업을 해 두는 반면 JMP는 백업하지 않고 바로 변경 2. Call은 조건 분기 가능한 명령어 형태가 존재하지 않으나 JMP는 조건 분기 가능한 명령어 형태가 존재한다. ex) JZ(=JE), JNZ, JA, JB, JG, JL etc ... 아래와 같은 코드에서 call이 수행되면 해당 함수로 이동한다. sumproc 부분을.. 2010. 5. 21.