리버스 엔지니어링 27

리버싱 공부 - 스택 프레임 기법

스택을 다루는데 있어서 ESP 레지스터, 현재 스택을 가리켜 주는 ESP레지스터를 사용하는데 함수를 만들고 사용할 때 함수를 들어가서 ESP 레지스터를 막 사용하다 보면 원래 돌아가야 할 위치를 알고 있더라도 함수의 시작 위치를 알 수 없게 되고 사용이 굉장히 복잡해진다. 그걸 방지?하기 위해 스택 프레임 기법이라는 방식이 도입되었다고 하는데. 함수를 들어갔을 때의 스택의 위치를 EBP레지스터, 베이직 포인터 레지스터가 가지고 있고, 함수에서 스택을 다룰 때 ESP를 사용 후 나중에 EBP에서 함수의 첫 주소를 가지고 있게 하며 안전하게 리턴할 수 있게 한다. 리버싱 핵심원리에 있는 예제와 비슷하게 코딩해봤다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2..

리버싱 공부 - 레지스터

레지스터라는 cpu에 있는 저장 공간을 이용해 데이터를 저장, 복사, 연산 등을 하는데 범용 레지스터들 EAX EBX ECX EDX AX, AL, AH BX, BL, BH CX, CL, CH CX, DL, DH 가 있고 EAX는 가장 자주 쓰게 되고 함수의 리턴 값이 EAX에 들어가기도, 함수의 인자로 사용하기도 함 ECX는 주로 반복문 등에 쓰여서 반복문의 카운터로 사용 EBX, EDX는 그냥 막 쓰이고 윈도우 API 등에서는 ECX, EDX를 자주 사용한다고 한다(나뭇잎 책에서 발췌) E(Extended)가 빠진 ~X레지스터는 16비트 레지스터 크기 ~L, ~H레지스터는 ~X 레지스터의 각각 하위, 상위 8비트로 나뉘어진 레지스터 크기 그 다음 플래그 레지스터 중 리버싱 핵심 원리에서 알아둬야 한다고..

리버싱 연습 - 점프에 관하여

리버싱 핵심원리 책을 읽으면서 레지스터에 관한 곳을 읽다가 보니 전에 리버싱 하던 게 생각났다. 반복문을 사용하는 곳에서 비교해서 점프하는 문에 관해서 의문점이 갔었는데,(잘 몰랐기 때문에) jz나 jnz처럼 비교해서 점프하는 어셈블리어는 그 앞에 cmp로 비교하는 어셈블리가 나와야 나오는 줄 알았지만 점프문 전에 연산이 있을 때 무슨 연산이건 그 연산의 결과가(레지스터) 0일 때 바뀌는 ZF(Zero Flag)값을 비교해서 jnz 명령어가 실행되는 거였다. EDI에 SUB명령어로 1을 감산한 연산이 있은 후에 JNZ에서 ZF를 검사해서 실행되고, 오른쪽에 올리디버거가 보여주는 ZF가 1일 때(EDI에 연산을 해서 EDI가 0일 때) 실행되지 않아서 그 다음줄로 넘어간다. 해석하자면 EDI의 연산 결과가..

리버싱 연습 2 - 직접 문자열 패치

리버싱 핵심원리(부제:나뭇잎책)의 앞부분을 읽으면서 Hello World 프로그램을 문자열 패치 시키는 부분이 있어 실습해봄. 1 2 3 4 5 6 7 #include int WINAPI WinMain(HINSTANCE hinst, HINSTANCE pinst, LPSTR Cmdline, int cmdshow) { MessageBox(NULL, L"Hello World!", L"Hello", MB_OK); return 0; } Colored by Color Scripter cs 왜인지 책이랑 똑같이하면 오류나길래 기억나는 대로 WinMain으로 짰다. WinMain을 찾아 가 보는 과정은 스킵 f8로 실행시켜가다가 MessageBox가 뜨는 곳에서 bp걸고 다시 실행해 가면서 따라갔다. 슬슬 stub c..

올리 디버거 단축키

올리 디버거 단축키 [ctrl + f2] : 프로그램 재실행 [f7] : step into (한 줄 실행, call문에서 함수 안을 따라감) [f8] : step over (한 줄 실행, call문에서 함수를 실행하고 다음 줄로 넘어감) [f9] : step until stop (break point가 나오기 전 또는 프로그램이 멈추는 분기점까지 실행) [ctrl + f9] : step until return (return이 나올 때까지 실행) [;] : 주석(코멘트) 작성/수정 [:] : 라벨 작성/수정 [Enter] : 점프문 따라가기