본문 바로가기

Research/Reverse

C++ 뜯어보기 관련 되는대로 하나씩 정리. 1. C++ 가 이벤트 드리븐 방식으로 동작하기 때문에이벤트 발생 시에 해당 이벤트에 연결된 이벤트 핸들러를 찾는 것이 중요한 포인트아직까지는 핸들러 스택 프레임이 일반적이지 않은 케이스를 본 적은 없지만push ebp 류로 시작하지 않는 핸들러도 있다고 하니이런 방법론에 대해서도 잘 정리할 필요가 있겠다. 메시지 맵 struct 를 보면 struct AFX_MSGMAP_ENTRY{ UINT nMessage; // 윈도우 메시지 WM_PAINT, WM_CREATE 등 UINT nCode; // control code or WM_NOTIFY code UINT nID; // 메시지를 발생시킨 control ID (or 0 for windows messages) UINT nLastID;.. 더보기
About overflow flag 오버플로우 플래그에 관하여2011년 8월 22일 작성본 의문의 시작은 아래 밑줄 친 부분 때문인데, 양수 + 양수 = 음수 , 음수 + 음수 = 양수 일때 OF 가 발생한다.OF는 두개의 피연산자 부호가 다를 경우 절대 발생 하지 않는다. 모 사이트에 위와 같이 나와 있었다. 원래 알고 있던 바, OF는 부호 있는 인자에 대한 오버플로우 판단 플래그이며피연산자 부호와는 상관이 없다고 알고 있었다. 아래는 책을 참조하여 만든 플래그표. 왼쪽 피연산자 오른쪽 피연산자 연산자들의 관계 플래그에 미치는 영향 설명 X0X0YYOF=1 SF=1 ZF=1위의 경우와 반대의 경우로,오버플로우가 발생하며결과값은 음수다. #include main(){short value1;__asm{xor ax, axxor bx, bxm.. 더보기
intager <-> string 변환과 속도 오버플로우와 unvaild char 을 제외한 부호 없는 정수에 대해서, 10진법 문자열 -> 정수1. 변수 초기화2. 문자열이 종료될때까지 알고리즘 반복. 변환된 수는 변수에 저장.3. 문자 얻기3. 변수 * 10 하고. 3에서 얻은 새로운 문자 더하고.4. 2단계 반복. 정수 -> 10진법 문자열1. 문자열 초기화2. 정수가 0이면 알고리즘 종료.3. 정수를 10으로 나누고 몫과 나머지 계산.4. 나머지를 문자로 변환하고 변환된 문자를 문자열 뒤에 append.5. 몫이 0이 아니면 몫으로 3~5단계 반복6. 문자열 역순출력하여 문자열에 저장 알고리즘이 중요한 게 아니라, 이 과정들이 문자출력할 때마다 일어나고, 나눗셈은 겁나 느리다.그래서 printf 류의 출력이 많아질수록 느려지는 것. 더보기
ARM 에서는 current instruction 과 PC 가 같지 않다. 명령어 중 이런게 있었다 0x8448 mov r3, pc0x844a mov r4, pc r3 에는 0x8448 이, r4 에는 0x844a 가 들어갈 것 같았는데실제로는 r3 에는 0x844c, r4 에는 0x844e 가 들어갔다. 조금 찾아보니 pc 값은 thumb mode 에서는 항상 +4 byte , arm mode 에서는 +8 byte 라고 하는데..(http://www.iamroot.org/xe/Kernel_8_ARM/49399)그래도 pc값을 저장하는 시점에서 + 4byte 값이 들어간다는 것이 이해가 안되었다. 영어 자료에서 찾게 된 내용은 이렇다. ARM 파이프라인에는 3 단계가 있어서, PC는 항상 fetched 된 인스트럭션을 가리키고 있습니다. 명령어가 해석되는 단계에서는 PC-4, .. 더보기
olly/ida에서의 HW Bp 처리방식 차이 디버그 모드올리스레드가 서스펜드되어 있을 때 HW 브포를 걸거나 풀면올리 HWBP 에서는 보이지만 프로그램 내부에서는 계속 Debug Register 내용이 감지된다.GetThreadContext 로 받아오는 Debug Register 값은 0 아이다스레드가 서스펜드 되든 말든 상관없이 잘 감지된다.GetThreadContext 로 받아오는 Debug Register 값 -1 릴리즈 모드체크안됨 왜 하나는 -1이고 하나는 0인가 ?일반 실행에서는 0이다. 더보기
[써볼만한 주제] unlikly 결과 어셈블리는 ? - 더보기
Anti Reverse Engineering - BreakPoint 리버스 엔지니어가 사용하는 BP 의 종류에는 보통 세가지 - 하드웨어 / 메모리 / INT 3h - 가 있다. 동적 분석에 있어 리버서에게 필수적인 BP 는 실행 중인 코드 어디든 설치할 수 있으며 또한 실행을 멈출 수 있다. BP를 적절히 활용함으로써 리버서는 API 를 분석할 수 있고 또한 원하는 메시지를 훨씬 쉽게 찾을 수 있다. BP는 리버싱 과정에서 문자열을 검색하는 것 만큼이나 가장 많이 활용되며, MessageBox / VirtualAlloc, CreateDialog 와 같은 중요도가 높은 API 함수를 체크하는 데 활용할 수 있다. INT 3 BP를 가장 흔히 표현하는 방법이며 IA-32 명령어에서 0xCC opcode로 표현하고 있다. 0xCC 를 0xCD 0x03 으로도 표현 가능한데 .. 더보기