목록Reversing (19)
Iriton's log
*본 포스트는 '리버싱 입문' 책을 참고하여 작성되었습니다. 1. 리버싱을 위한 프로그램 실행 구조 컴퓨터의 기본 요소 - CPU - 메모리 - 하드디스크 실행할 수 있는 파일(exe)은 기본적으로 HDD에 저장된다. 윈도우 상에서 이 실행 파일을 PE(Portable Executable) 파일이라고 부른다. PE 파일 구조 - Header: 중요 정보가 들어 있다. 해당 정보를 Loader가 분석해서 Body에 있는 Code와 Data를 메모리에 배치한다. - Body: Code, Data가 들어 있다. 메모리 구조 - 코드 영역: 프로그램 코드가 들어간다. - 데이터 영역: 정적 변수, 전역 변수가 들어간다.(고정된 값) - 스택 영역: 함수 호출 시 사용되는 매개 변수, 지역 변수가 들어간다. (코..
Name이 CodeEngn일때 Serial을 구하시오. 풀이 올리디버거를 열어 무작정 한줄 실행을 하다보니 CALL 함수가 실행되고 아무것도 없던 화면에 문구가 떴다. Enter your Name 이라는 문구를 띄우는 코드 근처로 가서 분석해 보기로 했다. EAX와 EBP-3C와 비교하고 점프문이 실행된다. 비교문에 BP를 걸어두고 재실행하여 레지스터 값을 비교해 보았다. EAX엔 사용자 입력값이 저장됐다. EBP-3C 주소를 찾으면 된다. 70FEEC 주소로 가면 된다. 여기서 4바이트만 긁어서 변환해 주면 된다. 이때 리틀엔디언으로 표현되어 있기에 순서를 바꿔서 E4 C6 0D 97을 변환해야 하는 것에 유의해야 한다.
Name이 CodeEngn일때 Serial을 구하시오. 필요 개념 정리 Ollydbg 메뉴더블 클릭: 해당 주소로 이동 Az 아이콘: 현재 보고 있는 모듈에 있는 문자열들을 참조하는 어셈블리어를 검색해줌. CMP: 두 값을 비교한다. 두 값이 같다면 ZF가 1로, 다르면 0으로 설정됨. JNZ: JNZ A - 비교 값이 0이 아닌 경우 A로 이동, 0인 경우 점프하지 않고 다음 코드 실행. 비교된 값이 있어야 하므로 앞에 CMP가 먼저 실행되어야 함. EAX: 산술, 논리 연산을 수행. 함수의 반환값이 이 레지스터에 저장. 호출 함수의 성공 또는 실패 여부를 쉽게 파악할 수 있으며 반환값을 쉽게 얻어올 수 있음. 리틀 엔디언: 데이터 저장을 위해 메모리에 바이트를 저장하는데, 이 바이트를 저장하는 배열 ..
OEP를 구한 후 '등록성공' 으로 가는 분기점의 OPCODE를 구하시오. 정답인증은 OEP + OPCODE EX) 00400000EB03 필요 개념 정리 ASPack 패킹: PUSHAD → 복호화 코드 실행 → POPAD → Return 0C → OEP 값 PUSH → Return으로 OEP 주소로 이동 ASPack 언패킹하는 법-하드웨어 BP를 이용하여 언패킹하는 법 -RET C를 찾아 OEP를 찾는 법 PUSHAD: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI 순으로 레지스터의 값을 스택에 저장 레지스터들의 값을 보관해야 할 때 사용 POPAD: PUSHAD 명령어로 스택에 보관해 놓은 레지스터 정보를 다시 이용할 때 사용 RET(RETN): CALL을 통해 호출된 함수에서..
StolenByte를 구하시오 Ex) 75156A0068352040 필요 개념 정리 StolenByte: 패킹된 바이너리를 언패킹할 때의 과정을 방해하기 위한 방법으로, 프로그램의 일부 바이트를 별도의 영역에서 실행되게 하여 OEP를 다른 위치로 가장하고 덤프를 쉽게 하지 못하도록 구현한 기법.따라서 OEP를 찾아서 덤프를 떠서 언팩했다고 생각하고 실행하려고 하면 실행되지 않는 것이다. OEP의 옵코드 몇 바이트가 JMP 직전에 있었기 때문에 OEP로 코드 조각이 오지 못했고, 예를 들어 함수의 인자값에 대한 push 옵코드였다면 함수의 인자가 충분하지 않으므로 실행에서 에러가 나게 되는 것이다. 이런 경우 소위 StolenByte라고 하는 옵코드를 찾아서 실행코드 부분에 복원을 해준 다음 언팩 해주어야..
OEP를 구하시오 Ex) 00400000 필요 개념 정리 OEP: Original Entry Point - 패킹된 파일의 실제 프로그램 시작 부분 OEP 이전의 실행 부분은 패킹된 파일이 메모리에 로드되어 압축을 푸는 명령어가 들어 있다. UPX 패킹: PUSHAD로 레지스터 백업 → 아바축 해제 루틴 실행 → POPAD로 레지스터 값 복구 → OEP로 점프 UPX 패킹 파일 구조:[SECTION UPX1] - 압축 코드가 저장되어 있는 공간 [SECTION UPX0] - 메모리에 로드된 후 압축 코드가 해제될 공간 JMP: 압축 해제 루틴 맨 밑에 있는 원본 코드로 이동하기 위한 명령. 이 명령이 실행되어 이동하는 주소가 원본 코드의 시작점인 OEP이다. BP: Break Point - 값이 변경된 경..
Unpack을 한 후 Serial을 찾으시오. 정답인증은 OEP + Serial Ex) 00400000PASSWORD 풀이 언패킹을 한 후 시리얼을 찾으라고 하니 뭘로 패킹되어 있는지 확인해 봤다. UPX 패킹이다. cmd - upx.exe -d 06.exe 명령어로 언패킹해준 뒤 올리디버거로 열어봤다. 프로그램을 실행해 봤을 때 시리얼값이 틀리면 Wrong Serial! 이란 창을 띄웠다. 그걸 띄우는 코드로 이동하기 위해 [Search for - All referenced text strings]를 이용했다. 텍스트가 많긴 한데 맨 위쪽에 떴다. Good job과 You got it 이 궁금해서 더블클릭 해 봤다. 역시 여기서 시리얼 값을 찾으면 된다. 임의의 값인 1234를 시리얼 창에 기입하고 한..
이 프로그램의 등록키는 무엇인가 풀이 무슨 프로그램인지는 잘 모르겠다. 이것저것 눌러보니 등록키가 저런 숫자와 영어 조합인 거 같은데 코드 분석으로 찾으면 되는 거 같다. PEiD로 확인해 보니 UPX로 패킹되어 있는 것을 확인할 수 있었다. 이제 UPX 패킹은 익숙하다. 등록키를 찾기 위해 cmd를 통해 언패킹을 해준 뒤 올리디버거로 열어볼 것이다. 언패킹 하는 법: [upx가 다운받아져 있는 파일에 05.exe를 옮긴 뒤 cmd 실행 - upx.exe -d 05.exe] 그럼 이런 화면이 뜬다. 등록키를 정상 입력됐을 때 뜰 만한 문구를 찾기로 했다. [우클릭 - Search for - All referenced text strings] 그럼 이렇게 텍스트를 띄우는 코드들이 뜬다. 저 중에서 "Con..