리버스 엔지니어링 27

리버싱kr easy_elf 풀이

맆케알의 easy_elf 문제를 풀어보기로 했다. 실행시 첫 줄이 출력되고 입력을 받는다. 1234를 입력했더니 Wrong를 출력하고 꺼진다. radare2로 프로그램을 열어보았다. 함수 목록을 띄워주는 afl명령어를 쳐 보았더니 엔트리와 메인이 나뉘어져 있다. 메인 함수부터 디스어셈된 데이터를 구경해보자. 메인 함수에서 Easy_ELF출력을 위해 write 함수 사용 전에 인자를 넣는 모습을 볼 수 있다. write 함수를 call 후 알 수 없는 함수 2개를 call, 그 이후에 eax와 1을 비교해 eax가 1이 아니면 jmp를 하여 Wrong을 출력하는 것을 메인 함수에서 알 수가 있었다. 그럼 맞췄을 땐 뭐라고 하는지 찾아봐야겠다. strings를 이용해 문자열이 뭐가 있는지 찾아봤다. Corr..

[리버싱] 윈도우에서 아무것도 설치하지 않고 Hex Data 수정

이번 글은 저번 메모장 시간/날짜 표시 변경 과 연결되는 이야기를 해 보려 한다. 윈도우에서 16진수 데이터를 다룰 수 있는 도구는 없다. 맞는가? Debug.exe를 통해 도스시절 어셈블리 수정, 메모리 수정이 가능하다는 글을 봤기도 했고 검색도 했지만 사용법을 아직 모르겠어서 정리를 하지 않았다. 윈도우에서 기본으로 제공해 주는 메모장, 워드패드는 16진수를 지원하지 않는다. 정확히는 아스키코드 상(또는 유니코드상으로라도) 표시할 수 있는 문자만 표시한다. 가령, 0x77 등의 바이트는 출력하지 못하거나 공백으로 출력해 버린다는 소리이다. 그래서 16진수를 에디터처럼 다룰 수 없다고 알고있다. 그러나 우리의 윈도우 개발자는 더 발전된 커맨드라인 창, Windows PowerShell을 만들어냈고, 윈..

[리버싱] 메모장 시간/날짜 표시 순서 변경

메모장을 유용하게 사용 할 때가 있었다. 윈도우 기본 메모장에는 f5키를 누르면 날짜와 현재 시간을 찍어 출력해주는데, 순서가 불편했다. 오후 4:13 2020-01-24 이런 식으로, 날짜가 뒤에 나오는 것이 불편하여 호기심에 이걸 바꿔보고 싶어 리버싱을 시작했다. x32dbg로 열어, 함수 목록을 찾아보았다. f5를 눌렀을 때 시간 정보를 가져오니까 Get가 써진 함수중에 time이 붙은 함수가 있길래 bp걸고f5를 눌렀더니 멈췄다. 이 곳이 f5를 눌렀을 때의 이벤트 핸들러 함수가 있는 장소라고 생각했다. 함수를 쭉 둘러보고 몇 번 실행해 보며 관찰했다. 함수가 끝나는 부분 전에 핸들러의 edit박스를 수정하는 함수를 호출하고, 마무리짓고 끝낸다. 그리고 그 위를 보면 반복해서 뭘 호출하는데, 저 ..

[리버싱] 과연 이게 될까? Ch.1

인라인 코드 패치를 실습 후 리버싱 핵심 원리 책을 정독 중, pe header 공부를 하는 챕터에서 Dos Stub를 유심히 살펴 보았다. pe header의 스펙에 따르면, 각 섹션은 characteristics라는 엑세스 권한 비트를 가지고 있다. 그러나 pe header가 메모리에 올라갔을 때의 엑세스 권한은 알려져 있지 않은것 같은데, 디버거로 메모리 맵을 살펴보면 읽기 권한만이 부여되어 있는 것을 볼 수 있다. pe header는 프로그램을 실행할 때 pe 로더가 메모리를 정해주고, 프로그램의 스펙이 어떻게 되어 있는지 나와있는 중요한 곳이기 때문에 보호받아야 한다. 아마도 pe 로더가 pe header가 메모리에 올라갈 때 읽기 엑세스만 주어진 것으로 보인다. Dos Stub는 16비트 이하..

인라인 패치 실습 - Code Cave patch

인라인 패치 실습으로 Code Cave를 해 보도록 하겠다. abex crackme1의 MessageBoxA 함수에 인자로 들어가는 문자열을 패치시킬 것이다. 참고로 abex crackme1은 ASLR이 적용되지 않은 프로그램이다. 일단 abex crackme1을 x32dbg로 열었다. 틀렸을 때의 분기로 점프해서 넣는 인자(문자열)의 주소는 각각 402035, 402038이다. 이 주소에 각각 새로운 문자열을 써 넣어 볼 것이다. 새 문자열은 Code Cave?!와 Code Cave Patched!!이다. Code Cave를 하기 전에 이 파일의 pe 구조를 보아야 한다. 섹터가 어디부터 이루어져있는지를 봐야 하기 때문이다. Pe Backpack과 HxD로 열어서 구조를 확인 해 보았다. 코드 섹션의 ..

crackmes.one crackme 001 by disip 풀이 + 크래킹 프로그램 제작

crackmes.one 에서 very easy 난이도의 크랙미 중 하나를 풀어보았다. by disip 로 되어있는 크랙미인데 시리얼미이다. readme에 의하면 자기가 만든 첫 크랙미라고 하고 난이도는 10점주자면 0점이라고 할 정도로 쉽다고 한다. NAME과 PASS를 입력하고 Register 버튼을 눌러 PASS를 맞추는 프로그램이다. 디버거로 열어서 DlgItemTextA 함수를 호출하는 곳을 찾았다. 총 두 번 호출 후 문자열의 길이를 비교해서 3보다 크면 함수를 호출한다. 함수는 루틴을 거쳐가며 시리얼을 반복을 통해 검사하는 것을 볼 수 있다. 루틴을 통해 NAME의 값을 시리얼로 통째로 어느 공간에 저장하는 것이 아닌 반복문에서 시리얼을 제작해 가면서 PASS 문자열과 계속 검사를 하게 된다...

crackmes.one 크랙미 3개 풀이

최근에 알게 된 사이트로 crackmes.one라는 사이트에 리버싱을 위한 크랙미가 많이 있다. very easy 난이도를 가진 것부터 시작했다. 여기 있는 모든 문제의 난이도는 very easy였던 걸로 기억한다. 이전에 작성된 풀이보다 좀 짧고 생략된 설명이 있을 수 있다. 1. crackme1.EXE 압축을 푼 폴더의 이름을 바꿔둬서 원 작성자가 기억이 나지 않는다. 비밀번호를 입력해 맞추는 형식이다. 크랙미 모듈로 들어가면 바로 보인다. 입력한 결과와 아래의 루틴을 통해 연산한 값으로 비교를 통해 틀림과 맞음을 구별. 연산은 문자열 각 한개씩을 비교해 가며 문자와 문자를 비교해 같거나 크거나 작음을 보고 edx를 가산/감산한다. 연산을 정리해서 key를 구하는 코딩을 하였다. -1, 1이 아니더라..

레나 리버싱 Tut.ReverseMe1 풀이 2

이전에 Nag 메시지창을 띄우지 않게 하는 것까지 해 보았다. 다음은 Register me!버튼을 클리어 하는 과정을 따라가 보자. 1234를 입력하고 Register me!버튼을 누르면 당연하게도 틀렸다고 나온다. Nag버튼의 문제를 해결하기 위해 했던 방법을 생각해보자. Nag버튼을 눌렀을 때 Nag 메시지 버튼이 새로 나왔었다. 이번의 Register me!버튼도 틀렸을 때 틀렸다는 메시지 창이 나오게 된다. 그렇다면 틀렸을 때 이전과 같은 rtcMsgBox함수를 호출할 것이다. Nag를 해결할 때 rtcMsgBox함수가 있는 곳을 찾아 모든 곳에 bp를 걸었으면 1234를 입력 후 Register me! 버튼을 눌렀을 때 bp에서 멈추게 될 것이다. rtcMsgBox함수를 호출하는 곳인 bp에서 ..

레나 리버싱 Tut.ReverseMe1 풀이 1

리버싱 핵심원리(소위 나뭇잎책)에서의 레나 리버스미 문제 풀이를 책을 따라가 보며 풀어보았다. 분석은 책에서 쓰인 올리디버거를 사용하였다. Tut.ReverseMe1 문제는 처음에 Nag Screen이라는 박스가 뜨고 확인을 누르면 다음 창이 뜬다. 이게 다음 창인데, 여기서 Regcode를 맞춰서 Register me 버튼을 누르는 비밀번호 문제인 것 같다. Nag Screen 메시지창의 뜻은 모든 Nag?를 삭제(무시)시키고 올바른 registration code를 찾아라는 뜻이다. 메인 창에서도 Nag?버튼을 누르면 다시금 Nag Screen창이 뜨게 된다. 우선 책도 그렇고 문제에서 요구하는 것도 그렇고 Nag창을 없애기 위해 Nag창 부터 찾아봐야겠다. 버튼들이 있는 윈도우 폼인것을 봤을 때 버..

리버싱kr easy_unpackme 풀이

리버싱kr의 세 번째 문제인 easy_Unpackme를 풀어보려 한다. 제공된 텍스트 파일에 적힌 것을 보면 OEP(Original Entry Point)를 찾으라고 한다. exeinfope로 본 엔트리 포인트는 이상한 곳을 가리키고 있다. 실행 파일의 엔트리 포인트가 이상한 곳으로 잡혀 있고, 원래의 엔트리 포인트를 찾아 그 주소로 auth 인증을 하는 것 같다. 참고로 올리 2버전에선 올리가 알아서 oep를 찾아서 처음에 위치시키기 때문에 문제를 푸는 의미가 없어진다. 그렇기 때문에 풀이에는 x64dbg를 이용했다. 파일을 불러왔다. 모듈 ntdll.dll에서 시작하고, 전혀 모르겠는 주소로부터 시작한다. 보통 실행 파일은 내가 만든 사용자 코드로부터 바로 시작하지 않기 때문에 ntdll으로부터 실행..