본문 바로가기
반응형

어셈블리어9

[리버싱] 메모리 구조 코드(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.
[리버싱] 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.
[리버싱] Break Point에 대해 알아보자 Break Point(브레이크 포인트)란? 프로그램을 실행하는 도중에 유저가 필요한 시점에서 프로그램을 일시정지 시키는 역할. 디버깅 기법 중 하나. 소프트웨어 브레이크 포인트 명령을 실행하는 CPU를 일시 중지, 한 바이트 명령어를 사용해 디버깅 대상 프로세스의 실행을 중지 보통 어플리케이션을 디버깅할 때 사용되는 브레이크 포인트, 일반적 코드 : 0xCC, INT 3 동작방법 1. 현재 주소의 opcode를 뽑아서 브레이크 포인터 테이블에 저장 2. opcode를 0xCC로 교체 3. 명령어 실행 4. 원래의 opcode로 돌려놓음 종류 - 일회성 브레이크 포인트 : 브레이크 포인트 리스트에 정보가 들어가고 브레이크가 수행되고 나면 리스트에서 정보가 제거된다. - 지속적 브레이크 포인트 : 리스트에 .. 2017. 8. 24.
[리버싱] 리틀 엔디언&빅 엔디언 엔디언(Endianness)이란? 컴퓨터의 메모리와 같은 1차원 공간에 여러 개의 연속된 대상을 배열하는 방법이다. 빅 엔디언(Big-endian)과 리틀 엔디언(Little-endian)으로 나눠진다. 빅 엔디언(Big-endian) 최상위 바이트(MSB)부터 차례대로 저장하는 방식이다.장점 디버그를 편하게 해주는 경향이 있다. (사람이 숫자를 읽고 쓰는 방법과 같기 때문) TCP/IP는 16비트와 32비트 정수에서 빅 엔디안 방식을 사용한다. 숫자 비교시, 유리 UNIX에서 사용하는 바이트 오더 리틀 엔디언(Little-endian) 최 하위 바이트(LSB)부터 차례대로 저장하는 방식이다. 장점 메모리에 저장된 값의 하위 바이트들만 사용할 때 별도의 계산이 필요 없다. 수치 계산시, 유리 Intel에.. 2017. 8. 23.
반응형