본문 바로가기

리버스엔지니어링

2013.12.29 그냥 놔두면 아무것도 안하고 게임만 할것 같아서이렇게 시험기간, 기념일을 제외하고서는 하루마다 어떤 리버싱을 했는지 적어보기로 해봤습니다. 그냥 오늘은 평범하게 suninatas란 사이트를 발견해서 바이너리부분을 풀어봤습니다.사실 발견한건 27일인데 가입해두고 풀려는 찰나 이번 기말고사 성적때문에 못하게되서 오늘 풀어보네요.20번은 pass한 숫자만 봐도 옆의 3개에 비해 어려울것같은데요,옆의3개를 30분안에 끝내고 현재 외식하러 가기때문에 20번은 내일 풀어볼것같네요. ※그나저나 방학하니까 이런 여유도 부릴수 있고 좋네요. 더보기
랜덤 뽑기 프로그램 버그 수정 학교에서 가끔 자리를 제비뽑기로 결정하는데요, 일부 종이가 사라져서 2학기부터는 랜덤 뽑기 프로그램을 쓰고있습니다.그중에 우리 반이 쓰는 프로그램은 베이직 And C님께서 만드신 프로그램을 쓰고있습니다.이렇게 생겨서 리스트에 번호를 추가한다음 뽑기를 해서 나온 순서대로 앞에서 부터 앉습니다. 근데 왜 이걸 제가 예기하냐고요? 설마 제가 그냥 다른분께서 만드신 프로그램을 소개하려고 포스팅을 할까요.바로 맨 마지막 리스트가 안뽑히는 버그가 발견되어서 한번 프로그램을 분석해본 후에 직접 리버싱을 통해 버그를 고쳐보았습니다. 일단 맨처음에 바로 뽑기가 어떤식으로 이루어지는지 보겠습니다.뽑기로 가는방법은 아무런 리스트도 추가하지 않은채 시작을 누르면 나오는 창에 back to user mode를 통해 그 근처로 .. 더보기
IA-32 opcode map-1 일단 지금 하고 있는것이 기계어-> 어셈블리어로 변환시키는 방법이므로 intel이 어떻게 기계어 구조를 만들었는지를 알기 위해서 Intel에서 제공해준 공식 메뉴얼을 봐봤습니다. 이 메뉴얼은 intel공식 홈페이지를 가서 메뉴얼 다운로드를 하면 나옵니다. 먼저 인텔 기계어의 가장 기본적인 구조입니다.1)Instruction Prefixes: 1바이트로 Opcode를 보조하는 역할을 합니다.(선택적: 없어도 됨)2) Opcode : 1,2,3 바이트로 어떤 명령어인지를 알려줍니다.3) ModR/M : 1바이트로 각각의 bit가 Mod, Reg/Opcode,R/M으로 되있으며 Opcode가 원하는 그 어셈블리어에서 명령어 뒤에 나오는 값이 라고 생각하면 됩니다.(선택적)4) SIB : 1바이트로 각각의 bi.. 더보기
EP찾기 RAW=RVA-VA+PointerToRawData라는것을 이용해서EP의 RVA를 OptionalHeader구조체서 참조해오고,VA와PointerToRawData를 code부분의 Sectionheader구조체서 참조해오고,그것을 계산시킨값을 code라는부분에 저장시켜봤습니다.일단 이상태는 기계어(어셈블리어가 아님)일테니까 실험적으로 20바이트만 출력해보도록 해봤습니다. 그러니 이렇게 기계어가 막 튀어나오는데 실제 이 기계어는 올리디버거의 Opcode와 똑같습니다. 다음번에는 이제 IA-32의 instruction과 함께 이 기계어로부터 어셈블리어로 변환시키는 작업을 해보겠습니다. 더보기
Junior CTF Level2 오랜만에 해커스쿨을 좀 돌아보고 있었는데 멍멍님이 올리신 Junior CTF가 있더라고요.그래서 한번 풀어봤습니다.현재 예선전이 끝났으므로 풀이를 올려도 상관없을거라 생각해서 올립니다.문제가 있을시 덧글로 알려주시면 감사하겠습니다. 이렇게 문제가 주어지는데요.파일을 다운로드 해서 실행해보겟습니다. 이런식으로 패스워드를 입력하라고 한다음 맞음,틀림을 구분한다음 그 결과에 해당하는 메시지박스를 출력합니다. 일단 가장 간단한 리버싱기법인 Back To User 기법을 사용해보겟습니다. 그러니 이렇게 메시지박스를 만드는 부분이 있고,그 위로 password를 검사하는 부분이 있습니다. 이런 식으로 password가 있는데 이 어셈블리어를 자세히 읽어보면 A(레지스터값)을 99와 xor한뒤 그 값이 0xF1,0x.. 더보기
PE 구조 정리-2 저번 PE 구조 분석에 이어서 이번에는 Section header와 Section에 대해서 분석을 해보겠습니다.1) Section header이부분이 바로 Section header부분입니다. Section header 구조체가 하는 일은 각 Section을 분리시키고, Section들의 속성, 크기, 시작 위치 등 등을 정하는 곳입니다. #define IMAGE_SIZEOF_SHORT_NAME 8 typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; union { DWORD PhysicalAddress; DWORD VirtualSize; } Misc; DWORD VirtualAddress; DWORD SizeOfRawDat.. 더보기
디스어셈블러 원리 파악 리버싱 관련 블로그들을 찾아봐도 디버거를 만드는 방법을 알려주는 분들이 없어서 어떻게 만들까 고민을 하고 있었는데 이번에 PE구조 관련 글을 쓰기 위해 여러 프로그램을 분석, PE구조를 찾아보니까 PE구조의 Section에서 code부분의 기계어와 올리디버거로 돌렸을때의 기계어코드가 일치한다는 것을 찾았습니다.현재 API를 열심히 공부하고 있으니 이 프로젝트는 아마 내년 여름방학쯤에 디버거를 만드는것으로 목표를 잡고 있습니다. 더보기
PE 구조 정리-1 PE(Portable Executable)파일은 말 그대로 옮겨다니면서 실행시킬수 있는 파일을 말합니다.Microsoft가 다른 운영체제와 이식성을 좋게 하기 위해서 만든 파일 포멧입니다.그러면 Microsoft가 이런 PE파일을 만들기 위해 제작한 PE 파일 구조에 대해서 공부를 해보겠습니다. 1. PE 파일공식적으로 PE파일의 종류는 실행 계열 : EXE, SCR 드라이버 계열 : SYS, VXD 라이브러리 계열 : DLL, OCX, CPL, DRV 오브젝트 파일 계열 : OBJ이렇게 OBJ를 제외한 나머지는 모두 실행 가능한 파일로 이루어져 있습니다.2. 배우는 이유PE파일 구조를 배우면 파일이 실행되기 위한 모든 정보를 얻을 수 있습니다.예를 들어 어느 메모리의 주소에 로딩이 되는지, 프로그램이 .. 더보기
레지스터 정리 리버싱을 하기 위해서는 먼저 어셈블리어를 배워야 하는데 IA-32플랫폼에서 쓰이는 어셈블리어에서 많이 쓰는 레지스터에 대해서 설명드리겠습니다. 레지스터는 알기 쉽게 c언어에서 변수를 선언한다고 보시면 됩니다. 하지만 c언어와의 차이점은 c언어는 자신이 원할때 변수를 맘대로 생성시킬 수 있는 반면에 어셈블리어는 이미 몇개의 레지스터의 갯수로 정해져있다는 점입니다. 다음 그림은 Basic program execution registers 그룹에 포함된 전체 레지스터 정리 그림입니다. 가장 위는 범용레지스터, 왼쪽아래의 EIP는 Instruction pointer, 그 아래의 EFLAGS는 프로그램 상태와 컨트롤 레지스터, 그 오른쪽은 세그먼트 레지스터입니다. 1)범용레지스터 범용레지스터는 이름 그대로 범용적.. 더보기
upx 언팩 드디어 upx 언팩 방법을 쓰는군요. 동아리 활동+ 시험기간이 다가오느라 블로그를 굉장히 오랬동안 못써서 미안해야 되지만 아직 시험기간이므로 5월달 되야지 다음글 쓸것같네요. ※너무 어렵고 귀찮다 싶으면 크고 강렬하게 색칠한 제목부분만 보고 맨 밑의 요약으로 내려가세요. ↓ 도입 저번 코드엔진 L06 파일의 언팩을 안한 상태로 디버거를 실행시키면 004298F0에서 pushad라는 명령어로 upx언팩부분이 시작됩니다. 그냥 코드를 쭉 읽어보면 mov esi,386D13B0.00424000 lea edi,dword ptr ds : [esi+FFFDD000] …… jmp short 386D13B0.00429912 이렇게 되있는데요 386D13B0은 파일 이름이니 빼면 1) esi레지스터에 00424000이라.. 더보기