본문 바로가기
반응형

리버싱8

[리버싱] 메모리 구조 코드(code) 영역 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(text)영역이라고도 부른다. CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 된다. 데이터(data) 영역 전역변수(global), 정적변수(static), 배열(array), 구조체(structure) 등이 저장된다. 데이터 영역은 쓰임새에 따라 3가지 영역으로 나뉜다. - 읽기 전용으로 초기화되는 영역 (.rodata) --> 상수키워드(const)로 선언되는 영역, 시스템에 사용된 각종 문자열 예를들어, printf()의 포맷스트링이나 상수 문자열 - 읽기/쓰기가 가능한 영역으로 초기화되는 영역 (.data) --> 전역변수 중 초기값을 갖는 경우 - 초기화되지 않은 영역 (.bss) --> 전역변수로 초기화 되.. 2017. 8. 24.
[리버싱] AND, TEST, CMP, SUB 차이 AND 비트연산을 수행한다. Operand의 값들을 2진수로 바꾸어 비트연산을 통해 값이 참의 값만을 가지고 온다. SUB 마이너스 기능을 수행한다. SUB a1, a2 형식이면 a1의 값을 a2만큼 감소한 후 결과값을 a1에 저장. TEST 첫번째 Operand와 두번째 Operand를 AND 시킨다. 이 연산의 결과는 ZF에만 영향을 미치고 Operand에 영향을 미치지 않고 버려진다. 두 Operand가 모두 0인지 아닌지 판단 가능. CMP 첫번째 Operand와 두번째 Operand를 뺀다. 이 연산의 결과는 ZF에만 영향을 미치고 Operand에 영향을 미치지 않고 버려진다. 두 Operand가 같은지 판단 가능. 2017. 8. 24.
[리버싱] CD.exe 문제풀기 문제를 풀어보자. 'HD를 CD-Rom으로 인식하게 하라'가 문제이다. 올리디버거로 분석해보자. 생긴건 이러하다. Code Window만 보면 주석을 보면 MessageBoxA, GetDriveTypeA와 같은 API가 있다. MessageBoxA는 메시지박스를 띄우는 API이고, GetDriveTypeA는 드라이브 타입이 어떤 타입인지 확인하는 API이다. 한줄씩 분석하다보면 ESI레지스터와 EAX레지스터의 값이 바뀌는 것을 볼 수 있다. EAX레지스터는 GetDriveTypeA가 실행되면 값이 3이 되는 것을 볼 수 있다. ESI는 증가하고 EAX는 값소하다가 401024를 보면 서로 비교를 한다. 비교 후, 같으면 JE 명령어로 인해 CD.0040103D로 가게되고 아니면 계속 진행 된다. 문제 해.. 2017. 8. 24.
[리버싱] API에 대해 알아보자 API(Application Programming Interface)란? 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻한다. 리버싱 때 유용한 API 파일 생성하거나 열기(Open)32bit : CreateFileAwide : CreateFileW 파일 입출력(Read&Write)ReadFile : 읽기WriteFile : 쓰기 파일 접근(Access)SetFilePointer 시스템 디렉터리를 얻어오는 함수32bit : GetSystemDirectoryAwide : GetSystemDirectoryW .ini 파일과 관련된 함수32bit : GetPrivateProfileStringA, GetPrivateProfileIntA, .. 2017. 8. 24.
[리버싱] hello world 문자열 패치 hello world 문자열 패치 hello world가 출력되는 소스이다. 이 프로그램을 리버싱 하여 다른 문자가 출력되게 해보자!! 우선 printf나 hello world 문자열을 찾으면 된다. hello wolrd가 담겨있는 404000을 찾아보자 주소와 아스키코드가 보여지는 Dump Window에 가서 ctrl + G를 하여 404000 주소를 입력한다. 아스키 코드를 바꿔서 hello man을 만들어보자. 이렇게 바꿔주면~~ hello man으로 바뀐 것을 볼 수 있다. Dump window창에서 바꾼 문자열을 드래그 하고 Copy to executable file을 누르고 save file을 하면 패치가 된다. 끝 2017. 8. 24.
[리버싱] 리틀 엔디언&빅 엔디언 엔디언(Endianness)이란? 컴퓨터의 메모리와 같은 1차원 공간에 여러 개의 연속된 대상을 배열하는 방법이다. 빅 엔디언(Big-endian)과 리틀 엔디언(Little-endian)으로 나눠진다. 빅 엔디언(Big-endian) 최상위 바이트(MSB)부터 차례대로 저장하는 방식이다.장점 디버그를 편하게 해주는 경향이 있다. (사람이 숫자를 읽고 쓰는 방법과 같기 때문) TCP/IP는 16비트와 32비트 정수에서 빅 엔디안 방식을 사용한다. 숫자 비교시, 유리 UNIX에서 사용하는 바이트 오더 리틀 엔디언(Little-endian) 최 하위 바이트(LSB)부터 차례대로 저장하는 방식이다. 장점 메모리에 저장된 값의 하위 바이트들만 사용할 때 별도의 계산이 필요 없다. 수치 계산시, 유리 Intel에.. 2017. 8. 23.
반응형