Reversing 18

3장 리틀 엔디언 표기법

컴퓨터에서 메모리에 데이터를 저장하는 방식을 의미하는 바이트 오더링이라 한다. 바이트 오더링이 무엇이냐? 데이터를 저장하는 방식을 말한다. 리틀 엔디언 표기법 빅 엔디언 표기법 간단하게 예시를 들어보자면 0x123456 이있다고 하면 빅 엔디언은 [12][34][56] 리틀 엔디언은 [56][34][12] 빅엔디언은 데이터를 저장할 때 사람이 보는 방식과 동일하게 앞에서부터 순차적으로 저장한다. 리틀엔디언은 역순으로 저장한다! 하지만 바이트 자체는 정상적인 순서로 저장이 된다. 오로지 2바이트 or 4바이트 자료형과 같이 멀티바이트 인 경우 각 바이트가 역순으로 저장되는 것 또한 str 문자열은 엔디엔 형식에 상관없이 동일하다. 빅 엔디언 사람이 보기에 직관적 대형 UNIX 서버에 사용되는 RISC 계열..

2장 Hello World! 리버싱

※ Release 모드로 빌드하면, 코드가 좀 더 간결해져서 디버깅하기 편하다. 참고 : https://jung2.net/visual-studio%EC%97%90%EC%84%9C-release-build-%ED%95%98%EA%B8%B0/ https://hsm-racoon.tistory.com/109 OllyDbg 사용법/단축키 (1)Code Window - Disassembly Code를 표시하여 Comment/Label 등을 보여주며 코드를 분석하여 Loop, Jump 위치 등의 정보를 표시 (2)Register Window - CPU 레지스터 값을 실시간으로 표시하며 특정 레지스터들은 수정까지 가능 (3)Dump Window - 프로세스에서 원하는 메모리 주소 위치의 Hex값과 ASCII/유니코드 ..

1장 리버싱 스토리

리버스 엔지니어링이란? 리버스 엔지니어링(역공학)이라고 불림 물건이나 기계장치, 시스템 등의 구조, 기능, 동작 등을 분석해 그 원리를 이해하며 단점을 보완하고 새로운 아이디어를 추가하는 일련의 작업 리버스 코드 엔지니어링 SW 분야의 리버스 엔지니어링 SW를 리버싱 관점에서 상세하게 분석한다는 뜻! 정적, 동적 분석 방법 정적 분석 파일의 겉모습을 관찰하여 분석하는 방법(파일 실행X) 파일의 종류(EXE, DLL, DOC, ZIP 등), 크기, 헤더(PE)정보, Import/Export API, 내부 문자열, 실행 압축 여부, 등록 정보, 디버깅 정보, 디지털 인증서 등의 다양한 내용을 확인하는 것 디스어셈블러(Disassembler)를 이용해서 내부 코드와 그 구조를 확인하는 것 동적 분석 방법에 좋..

[Reversing.kr]Ransomware

처음에 ransomware 파일을 실행시켜보았다. 아무렇게나 Key를 입력하고 보니 응(?) 파일을 복구했다고 한다. 근데 보니 올바른 키값을 받아야 정상화가 되고 잘못된 키값을 넣으면 파일이 망가진다고 한다. 무슨소린고 하고 readme를 보았다. 이게 아마 힌트인듯 싶다 복호화 해야하고 EXE .. 일단 실행파일 EXE파일을 리버싱하기위해 보니 안되는 부분이 많았다. 그래서 검색을 통해 다음과 같은 툴을 이용하게 되었다. Exeinfo PE 는 A.S.L 이 만든 소프트웨어이며, 프리웨어 버전 이라고 되있는걸 보아하니 유료 버전도 있는 것 같다. 본 소프트웨어는 PEiD 와 같은 분석 툴이며, 실행 후 드래그&드롭 으로 간편하게 해당 프로그램이 어느 언어로 컴파일 되었는지, 또 패킹, 크립팅, 프로텍..

[Reversing.kr]Easy_KeygenMe

두근두근 두번째 Easy문제는 KeygenMe이다. 실행해보니 Input Name 과 Input Serial 을 입력하라고 나온다. 그럼 뭔지 모르니 디버깅시작! 쭉쭉 디버깅을 하다보니 여기서 실행이 되서 여기가 Main이 되는 함수라는 것을 추측하였다. 분석하다고 궁금한 어셈블리 명령어가 보였는데 ※STOS : EDI가 가리키는 값에 EAX를 쓴다 보통은 스택영역(EDI가리키는 주소)을 0으로 초기화 할때 이렇게 쓴다고 한다 요런느낌 char a[256]={0}; (REP (Repeat String) : ECX 레지스터를 카운터로 사용해서 문자열 관련 명령을 ECX>0인 동안 반복한다, 한번 진행될 때마다 ECX 레지스터값이 -1 된다.) ※TEXT명령어는 왜 쓸까? test가 영향을 미치는 플래그는 ..

[Reversing.kr]Position (미완성)

ReadMe를 열어보니 다음과 같았다. 음 76876-77776 일때 이름을 찾아라! 그리고 답은 여러개 라고 한다. 프로그램 시작해본 결과 무작위로 넣을수 있지만 디버깅 해보기로 하였다. 무한 삽질 끝에 드디어 단서 하나 찾은것같다. F7로 들어가 보도록 하였다. 쭉쭉 들어가 보니 이전 보다 확실히 깔끔하게 보이는 어셈명령이다. 구조를 보아하니 MAIN함수인것 같다. 여기서 또 한번 콜을 지나면 문제가 열리기에 더 들어가 보았다. 여기까지 뜬다 아직 완벽하게 Position이 켜지기 전이다. 너무 삽질하는건가 싶어서 String으로 알아보고 싶었다. 모든 부분을 보면서 Wrong이 있나없나 봤지만 ...Fail...ㅠㅠ 이부분이 의심이 된다. ※PeekMessage()함수는 GetMessage()와 다..

[Reversing.kr]Easy_CrackMe

파일을 실행시켜보았다. Hum.. 올바른 값을 넣으면 성공하는 프로그램인것같다. 동적분석을 위해 디버깅 시작! 스트링을 조사 해보니 성공과 실패가 나뉜다. 일단 먼저 입력을 받으니 입력을 받고 검증하는 부분이 있을 것이다. 디버깅을 통해 파악해 보자. 요부분이 이제 입력, 비교검증 함수 시작 부분이다.브레이크 포인트를 걸어주고 입력을 받고 확인해보자. 이렇게 입력해주고 살펴보자 첫번째로 값비교를 하는데 내가 입력한값 2와 ASCII값 61('a')과 비교해 틀리면 바로 "Incorrect Password!" 다시 "1a3456"으로 입력! 두번째 관문이다. 5y를 push하여 비교한다. 여기서 확인해 볼 수 있었다. 틀리면 틀리면 바로 "Incorrect Password!"로 넘어가는 루틴. 그렇다면 지..

[Reversing.kr]Easy_UnpackMe

먼저 ReadMe를 읽어 보았다. 파일을 실행하면 이런식으로 아무화면이 뜨지않는다. ReadMe에서 보시다 시피 OEP를 조사하던 와중 이 문제에서 필요한 지식을 검색해보았다. EP(Entry Point) 실행파일의 코드 시작점 프로그램이 실행될 때 CPU에 가장 먼저 실행되는 코드 시작 위치 헤더를 가리킴 OEP(Original Entry Point) 패킹된 파일의 실제 프로그램 시작 부분 JMP 패킹(Packing) 실행 파일을 암호화하거나, 압축하여 소스코드를 볼수 없도록 하는 것 분석하기에 어려움이 존재함(언패킹이 필요하기 때문에) 정적분석을 위해 이뮤니티디버거를 사용해주었다. 응 파일을 켰는데 오류가 난다. (아마 패킹이 되어서 제대로 안되나 보다) 걱정을 한움큼 가지고 무시한후 분석을 하였다...