Reversing

    [Reversing.Kr] Easy Keygen

    파일 확인 실행 이렇게 Name과 Serial을 입력하는 창이 뜨고, Serial까지 입력하고 나면 종료되는 프로그램이다. ➕ 문제 파일을 다운로드 받을 때 같이 첨부되어 있는 ReadMe.txt 파일을 열어보면 Serial 값이 "5B134977135E7D13"일 때의 Name 값을 찾아야 한다. 추측해보면,, Name 값을 암호화해서 Serial 값을 만들어내는 문제이지 않을까 싶다. serial 값을 만들어내는 알고리즘..?을 찾아내는 게 핵심일 듯 하다. - detect it easy ​ 파일 분석 pseudo code (IDA) v9: 사용자의 입력값을 저장 >> Name, Serial 첫 번째 scanf(aS, &v9)에서는 Name을 입력받는다. 입력받은 문자열 v9(name)에 대하여 이것..

    [Reversing.Kr] Easy Unpack

    파일 확인 실행 제대로 실행되지 않는다. - detect it easy 현재 파일의 entry point는 0040a04b이다. 파일 분석 x32dbg를 사용했다. 실행[F9]을 하면 위에서 확인한 entry point인 0040a04b에서 멈춘다. 코드들을 쭉 살펴보면 0040A04B부터 0040A1FB까지 특정 명령 그룹(?)들이 반복되고 가장 아래 두 개의 점프문 아래로는 opcode가 0으로 비어있는 공간임을 알 수 있다. 이 부분이 아마 unpacking code가 아닐까?라는 생각을 했다. 그리고 가장 마지막의 명령어 주소인 0040A1FB에 break point를 걸고 스텝오버를 해봤다. 스택 프레임의 형태(?)로 넘어갔다! OEP라고 추측해볼만 하다! 뭔가 좀 운이 좋게 풀린 느낌..?이지..

    [CodeEngn] BASIC RCE L14

    파일 확인 실행 - detect it easy upx 로 패킹된 파일이다. 우선 그럼 upx로 언패킹을 해봐야겠다. upx ​ 파일 분석 디버깅 ( 어셈블리 코드 확인 ) 문자열을 먼저 찾고 "Good Job" 문자열이 있는 위치로 이동해서 코드를 살펴봤다. jne 14_unpack.401353을 기점으로 "Good Job" 또는 "Wrong Serial" 문자열과 관련한 코드들이 나오는 걸로 봐서 cmp eax, esi 에서 사용자가 입력한 serial 값과 비교하는 듯 하다. 이 때 EAX에 저장된 값 0x2b67 = 11111로 입력한 값이다. ESI에 저장된 값 0x129A1 = 76193이다.

    [CodeEngn] BASIC RCE L13

    파일 확인 실행 password를 입력받고 비교하여 적절한 메시지를 출력하는 프로그램이다! - detect it easy 패킹되지 않은 파일이다. - PEiD C#으로 작성된 프로그램이다! ​ 파일 분석 디버깅 (어셈블리 코드 확인) C#으로 작성된 코드라서 그런가.. 익숙한 형태의 어셈블리 코드가 아니다. 그래도 나름대로 해석을 해보자면,, 사용자로부터 password를 입력받고, op_Equality를 호출해 두 개의 string 즉, 사용자가 입력한 password와 실제 password를 비교해 일치하는 경우 "Well Done!"메시지가 출력되도록, 일치하지 않는 경우 loc_202로 이동해서 (아마도 branch if false가 아닐까..) "Bad Luck!"메시지를 출력하도록 한다. ✔ ..

    [CodeEngn] BASIC RCE L12

    파일 확인 실행 사용자로부터 KEY를 입력받고 정답 KEY와 비교하는 프로그램이다. 파일 분석 문자열들 중 "Congratulation,~"을 찾아 해당 문자열을 참조하는 위치로 이동한다. 해당 코드 주변을 살펴보면 사용자가 입력한 값을 원본 key값과 비교하고 비교 후 "Congratulation"으로 넘어가는 cmp문이 있을텐데 cmp esi, 0보다는 cmp eax, 7A2896BF가 더 key값 비교하는 명령같다. 16을 입력해봤다. eax 레지스터에 입력한 값 16 (=0x10)이 저장된 것을 알 수 있다. 그렇다면, 0x7A2896BF (=2049480383)을 입력해보면 Congratulation 창이 뜬다! >> Key: 2049480383 HxD 이 영역이 Congratulation 메시..

    [CodeEngn] BASIC RCE L11

    파일 확인 처음 실행하고 "확인"을 누르면 Error 창이 뜬다. - Detect It Easy UPX로 패킹된 파일이다! 그냥 바로 upx로 언패킹해줬다. 파일 분석 언패킹하고 바로 실행하면 깨진 문자들이 보인다. 문제에서도 알 수 있듯, 이는 "Stolen Bytes(Remove OEP)"때문에 생긴 현상이다. ✔ Stolen Bytes(Remove OEP) 원본 코드의 일부, 주로 OEP 코드 부분을 패커/프로텍터가 생성한 메모리 영역에 가져다 두는 기법이다. 덤프를 시켰을 때 제대로 stolen bytes를 복구하지 못하면 제대로 실행되지 않고, 언팩했을 때 우리가 아는 그런 익숙한 코드가 아닌 다른 형태의 코드들이 나타난다. >> POPAD와 jmp OEP 사이에서 PUSH 하는 모든 코드들을 ..

    [HackCTF] strncmp

    ◾ 실행환경: IDA pro x64 check 64bit ELF 파일이다. analyze #main call strcmp_함수를 호출한다. mov [rbp+var_54], eax: rbp+var_54 위치에 eax 값을 저장한다. 이 때 eax에 저장되는 값은 strcmp_에서 리턴한 값으로, 만약 비교한 두 문자열의 값이 동일하다면 0을 리턴하고 같지 않은 경우 0이 아닌 값을 출력한다. cmp [rbp+var_54], 0: rbp+var_54에 저장된 값(strcmp_의 리턴값)과 0을 비교한다. rbp+var_54에 저장된 값이 0인 경우 ZF = 1로 설정된다. jnz short loc_400849: ZF가 1이 아닌 경우(not zero), 0x400849로 점프한다. #strcmp_ strnc..

    매뉴얼 언패킹(MUP) 사례 - ESP Trick으로 OEP 찾기

    📌 매뉴얼 언패킹(MUP: Manul UnPacking)의 핵심은 OEP를 찾는 것! ESP 레지스터를 활용한 OEP 찾기 스택 프레임: 함수가 사용하는 독립적인 메모리 영역 >> 함수가 실행 중일 때 존재하고 실행이 끝나면 사라짐 스택: 메모리와 달리 기준점(EBP 레지스터; 프레임 포인)을 중심으로 데이터를 참조 EBP(프레임 포인터) : 하나의 루틴에서 서브루틴으로 이동할 때 EBP 레지스터의 값을 따로 보관해둬야한다. 서브루틴에서 원래의 루틴으로 복귀할 때(return할 때) 따로 보관해뒀던 값을 EBP 레지스터에 복구시킨다. ESP(스택 포인터) : 현재 사용하는 스택의 맨 위를 가리킨다. 또한, EBP 레지스터의 값을 유지하는데 사용한다. PUSH EBP MOV EBP, ESP // 원래 루틴..

    패킹과 언패킹

    패킹과 언패킹 ◾ 패킹(packing): 프로그램 코드 크기를 압축 + 프로그램 분석을 어렵게 하기 위해 암호화 하는 것 ◽ 컴프레싱(compressing): 단순 압축 ◽ 프로텍팅(protecting): 암호화 하는 것패킹 = compressing + protecting 행 파일을 암호화해 분석을 어렵게 만드는 기술이다. ◾ 구조: 암호화된 상태의 실행코드 배포 → 실행 시, 실행 코드를 복화화해 동작 수행 언패킹 동작 방식 UPX로 패킹된 실행파일을 살펴보면 Empty Space, Packed Data, Unpacking Code로 구성되어 있다. Unpacking Code: UPX로 패킹된 파일을 언패킹할 때 필요한 코드 영역 Packed Data: 패킹된 데이터가 들어있는 영역 Empty Spac..

    abex crackme2

    파일을 우선 실행시켜보면 Name과 Serial 값을 입력하도록 나온다. 패킹된 파일은 아니다. PE 32타입의 파일인 것도 확인할 수 있다. assembly code를 살펴보면 어떤 분기점을 기점으로 "Congratulations" 또는 "Wrong serial!"을 출력한다. 그래서 이 영역들의 근처에서 Serial Key를 비교하는 부분이 있을 거라고 생각했다. (다만, IDA에서는 유니코드가 해석이 되지 않아서 ollydbg로 옮겼다 text ax, ax에 breakpoint를 설정하고 my_name, my_serial을 입력 내가 입력한 "my_name", "my_ serial"이 스택에 저장되어 있는 것을 확인할 수 있다. 이 영역에서 조금만 더 내려보면 my_serial과 함께 유니코드 값이..