no image
Easy Unpack (Point : 100)
이번엔 Easy Unpack 이라는 문제를 풀이해보도록 하겠습니다😀 우선 다운받아서 열어보도록 합시다! ReadMe 파일을 열어보니 OEP를 찾으라고 합니다. OEP란? Original Entry Point의 약자로써, 패킹이 되고나면 먼저 암호 루틴 코드가 시작되어 바로 원본 EP가 나오지 않습니다. 즉, 패킹된 파일에서 원본 EP 부분을 OEP라고 합니다.😄 프로그램을 실행시키니 아무런 어떤 것도 없습니다.😶 그래서 저는 PEiD를 활용하기로 했습니다! 우선 첫번째 쉽게 찾는 방법은 PEiD를 이용하는 것입니다. PEiD는 파일의 정보를 나타내어 주는 프로그램입니다😁 위의 사진에서 보시면 OEP를 바로 나타내어주고 있습니다! 오른쪽 하단에서 이 기능을 이용해주면 바로 OEP를 찾을 수 있습니다😄 다른..
2020.10.07
no image
Easy Keygen (Point : 100)
Easy Keygen 문제를 풀이해보도록 하겠습니다😁 문제를 다운받으니 문제의 프로그램과 ReadMe 파일이 있어서 ReadMe를 먼저 읽어봅니다! Serial이 "5B134977135E7D13"인 Name을 찾으라고 하네요😛 프로그램을 실행시켜보니 Name과 Serial을 입력하라고 나옵니다. 그럼 ReadMe의 Serial에 맞는 Name을 찾아야하네요! 찾아보도록 합시다😄 처음에 실행시키다 보면 401000으로 들어가는 함수를 찾을 수 있습니다! 들어가보니 "Input Name: "이라는 문자열을 찾을 수 있고 여길 분석하기 시작해야겠죠? 😋 처음에 ecx 레지스터에 [esp+esi+C]가 가리키는 곳의 값을 옮깁니다. [esp+esi*1+C]는 스택에서 [0019FE04]라는 곳을 보고 있는데 해..
2020.10.06
no image
Easy Crack (Point : 100)
첫번째 문제로 들어가보겠습니다 :D 프로그램을 실행한 다음 어떤 값을 입력하라고 합니다! 그랬더니 잘못된 값을 입력하면 "Incorrect Password"라는 경고메시지가 뜹니다😶 그럼 "x32dbg" 툴을 이용하여 동적분석을 해보도록 하겠습니다! "Incorrect Password" 문자열을 검색한 후 해당 함수의 EP에 BP를 걸었습니다. 1번째 분기점에서 제가 입력한 문자열의 1번째 문자를 비교하지않고 2번째 문자를 "a"와 비교하더군요! 즉, 제가 "TEST"라는 값을 입력하면 "E" 와 "a"를 비교하여 jne 같지 않으면 바로 비교가 끝이납니다. 2번째 분기점은 1번째 분기점 이후 2개의 문자를 "5y"와 비교합니다😊 즉, "TEST"에서 "ST"와 "5y"를 비교하여 같지 않으면 바로 비교..
2020.10.05

Easy Unpack

이번엔 Easy Unpack 이라는 문제를 풀이해보도록 하겠습니다😀

 

우선 다운받아서 열어보도록 합시다!

 

ReadMe

ReadMe 파일을 열어보니 OEP를 찾으라고 합니다.

 

OEP란?

 

Original Entry Point의 약자로써, 패킹이 되고나면 먼저 암호 루틴 코드가 시작되어 바로 원본 EP가 나오지 않습니다.

즉, 패킹된 파일에서 원본 EP 부분을 OEP라고 합니다.😄

 

프로그램 실행

프로그램을 실행시키니 아무런 어떤 것도 없습니다.😶

 

그래서 저는 PEiD를 활용하기로 했습니다!

 

PEiD

우선 첫번째 쉽게 찾는 방법은 PEiD를 이용하는 것입니다.

 

PEiD는 파일의 정보를 나타내어 주는 프로그램입니다😁

 

위의 사진에서 보시면 OEP를 바로 나타내어주고 있습니다!

 

Generic OEP Finder

오른쪽 하단에서 이 기능을 이용해주면 바로 OEP를 찾을 수 있습니다😄

 

다른 방법을 한번 보도록 합시다😀

 

40A1F8

코드가 길지않지만 중간중간 큰 루프문들이 조금 씩 있더라구요... 차차 내려가다보면

 

위의 사진처럼 40A1F8 주소에 jmp문이 있는 것을 볼 수 있습니다.

 

그리고 밑에는 OP Code로 쫘르르르륵 채워져있는 것을 볼 수 있는데

보통은 OEP로 넘어가는 코드 이후에 OP Code로 채워지는 경우가 있어서 점프문으로 넘어가 보았습니다😀 

 

OEP

jmp으로 401150으로 넘어와 보니 정상적인 코드 흐름을 발견할 수 있었습니다😁

 

그럼 이만 문제풀이를 마치도록 하겠습니다🤗

'CTF > Reversing.kr' 카테고리의 다른 글

Easy Keygen (Point : 100)  (0) 2020.10.06
Easy Crack (Point : 100)  (0) 2020.10.05

Easy keygen

Easy Keygen 문제를 풀이해보도록 하겠습니다😁

ReadMe.txt

문제를 다운받으니 문제의 프로그램과 ReadMe 파일이 있어서 ReadMe를 먼저 읽어봅니다!

 

Serial이 "5B134977135E7D13"인 Name을 찾으라고 하네요😛

Easy Keygen.exe

프로그램을 실행시켜보니 Name과 Serial을 입력하라고 나옵니다.

 

그럼 ReadMe의 Serial에 맞는 Name을 찾아야하네요! 찾아보도록 합시다😄

401000 함수

처음에 실행시키다 보면 401000으로 들어가는 함수를 찾을 수 있습니다!

Main 함수

들어가보니 "Input Name: "이라는 문자열을 찾을 수 있고 여길 분석하기 시작해야겠죠? 😋

암호화 키 10

처음에 ecx 레지스터에 [esp+esi+C]가 가리키는 곳의 값을 옮깁니다.

 

[esp+esi*1+C]는 스택에서 [0019FE04]라는 곳을 보고 있는데 해당 값이 10이라고 합니다😀

 

스택도 한번 보도록 합시다!

Stack

스택에서 살펴보니 10이 들어가있는 것을 확인할 수 있죠!

 

그런데 뒤에 20, 30의 값도 들어있는 것을 확인할 수 있습니다!

401083

그 다음 명령어에선 edx 레지스터에 [esp+ebp*1+10]의 값을 옮기는데

 

[esp+ebp*1+10]는 스택에서 [0019FE08]이라고 합니다.

 

제가 입력한 값 "test"의 "t"를 가리키는군요😀

Xor 연산

옮긴 이후 위의 두 값을 XOR 연산하고 있습니다!

 

그리고 이후 스택에 저장해두는 것을 확인하실 수 있으실 겁니다.

 

계속해서 살펴보도록 하겠습니다😀 

암호화 키 20

다시 돌아온 것을 확인할 수 있으며 암호화 루틴이라는 것을 알 수 있겠죠?😀

401083

그리고 "test"에서 다음의 값인 "e"를 가져옵니다.

Xor 연산

두 개의 값을 XOR 연산을 하고 저장하는 것을 또 보실 수 있으실 겁니다😁

암호화 키 30

이제 어느정도 30이 나올 거라 예상하고 보게 되겠죠?😀

401083

그리고 그 다음은 예상대로 "test"의 "s"가 나옵니다.

Xor 연산

그리고 XOR 연산을 한 후 저장하게 됩니다.

암호화 키 10

그럼 10, 20, 30 세 개의 숫자가 암호화 키라는 것을 알게 되었는데 4번째 문자부터는 어떻게 암호화하는지 봐야겠죠😀

 

살펴보니 4번째부터 다시 10의 값을 가져오는 것을 확인할 수 있습니다.

401083

그리고 예상대로 "test"의 마지막 문자인 "t"를 가져옵니다.

Xor 연산

예상대로 XOR 연산을 하고 저장하게 됩니다.

비교문

이제 암호화가 끝이 난 후 보니 "64454364"의 값이 생성이 된 것을 볼 수 있습니다😀

 

그리고 Serial 번호로 제가 입력한 값인 "5B134977135E7D13"과 비교를 하고 있네요!

 

첫 번째 분기점에서 첫글자와 비교 후 조건문이 참이 되지 않아 바로 끝나버립니다.

비교문 루틴

그래서 위의 영역이 비교문 루틴이라는 것을 알 수 있었고 정답을 어떻게 알아낼지 바로 생각이 나더군요😁

 

그럼 어떻게 정답을 알 수 있을까요?

 

암호화 루틴은 생각해보면 쉽게 알 수 있습니다.

 

"입력한 Name 값을 10, 20, 30 순서대로 XOR 연산한다"

 

그럼 주어진 시리얼 넘버를 10, 20, 30 순서대로 다시 XOR 연산을 해주면 답이 되지 않을까요😉

 

답이 길진 않으니 직접 일일이 하셔도 되고 Python으로 간단하게 코딩하셔셔 푸셔도 좋으실 겁니다!

 

그럼 이만 풀이를 마치겠습니다😆

'CTF > Reversing.kr' 카테고리의 다른 글

Easy Unpack (Point : 100)  (0) 2020.10.07
Easy Crack (Point : 100)  (0) 2020.10.05

Easy Crack

첫번째 문제로 들어가보겠습니다 :D

프로그램 실행

프로그램을 실행한 다음 어떤 값을 입력하라고 합니다!

 

그랬더니 잘못된 값을 입력하면 "Incorrect Password"라는 경고메시지가 뜹니다😶

 

그럼 "x32dbg" 툴을 이용하여 동적분석을 해보도록 하겠습니다!

문자열 검색

"Incorrect Password" 문자열을 검색한 후 해당 함수의 EP에 BP를 걸었습니다.

1,2번째 분기점

1번째 분기점에서 제가 입력한 문자열의 1번째 문자를 비교하지않고 2번째 문자를 "a"와 비교하더군요!

즉, 제가 "TEST"라는 값을 입력하면 "E" 와 "a"를 비교하여 jne 같지 않으면 바로 비교가 끝이납니다.

 

2번째 분기점은 1번째 분기점 이후 2개의 문자를 "5y"와 비교합니다😊

즉, "TEST"에서 "ST"와 "5y"를 비교하여 같지 않으면 바로 비교가 끝이 납니다.

3번째 분기점

3번째 분기점에서는 이후 문자열을 "R3versing"과 계속 비교를 하게 됩니다.

마지막 분기점

그리고 마지막 분기점에 보니 제가 입력한 문자열의 첫번째 문자를 비교하고 있습니다.

 

다른것과 동일하게 분석을 했으며 자세히 설명해보겠습니다😊

 

cmp byte ptr SS:[esp+4], 45

 

[esp+4] 는 esp의 주소값에서 4를 더한 곳의 주소를 45(E)와 비교하고 있습니다.

밑에 보면 친절하게 [ESP+4]가 무엇인지 가르쳐주고 있죠😄

 

하지만 스택에서 한번더 확인해봅시다!

스택

스택에서 보면 오른쪽에 [ESP+4]의 값이 79라고 생각할 수 있겠지만 리틀엔디언방식으로 들어가기 때문에

뒤에서 부터 읽어야합니다😄

 

해당 스택 값을 변경하기 옵션으로 다시 확인해보면 제가 넣은 문자가 거꾸로 스택에 PUSH된다는 것을 알 수 있죠!

(캡쳐 당시 프로그램 실행 후 "Ea5y"를 넣었습니다.)

Congreatulation!!

모든 분기가 끝이 난 후

"Congratulation!!" 이 출력되는 것을 확인할 수 있습니다😋

'CTF > Reversing.kr' 카테고리의 다른 글

Easy Unpack (Point : 100)  (0) 2020.10.07
Easy Keygen (Point : 100)  (0) 2020.10.06