틀린 부분이 있다면 언제든지 댓글 남겨주세요!
CodeEngn_Challenges Basic RCE L13
L13. 정답은 무엇인가
다짜고짜 정답이 무엇이냐고 한다..
우선 파일정보를 확인하고 파일을 실행시켜보았다.
123을 입력했더니 틀렸다고 다시 입력하라고 한다. 이곳에 입력할 패스워드를 찾는 것 같다.
파일의 정보를 확인해보니 C#으로 작성된 .net파일이다.
.net파일은 ollydbg에서 디버깅하기 어렵기 때문에 다른 프로그램을 사용한다.
dotPeek 프로그램에서 파일을 열어보았다.
세개의 cs파일이 보이는데 그 중 RijndealSimpleTest.cs파일에서 패스워드를 찾을 수 있을 것 같다.
* Rijndeal..익숙하다 싶었는데 대칭 암호 알고리즘이다. 이 알고리즘을 기반으로 AES암호화가 만들어졌다.
코드를 자세히 보니 cipherText, passPhrase, saltValue, hashAlgorithm, passwordIterations, InitVector, KeySize 값을 RijndaelSimple.Decrypt 함수에 넣은 결과를 str 변수에 넣는다. 즉 암호화된 패스워드를 복호화시킨 값으로 보인다.
이 str변수에 들어있는 값이 우리가 찾아야 할 정답으로 추측된다.
이 값을 실행창에서 사용자가 입력한 값과 비교하여 같으면 while문을 끝내고 "Well done! You creaked it!" 문자열을 출력한다. 같지 않으면 같을 때까지 해당 루프문을 반복한다.
이제 저 str값을 찾기 위해 프로젝트를 Export to Project해서 뽑아 visual studio 2017로 가져온다.
str 값을 확인하기 위해 해당 변수를 출력하는 코드를 추가하였다.
실행해서 결과를 보니 "Leteminman" 문자열이 출력되었다.
해당 문자열을 파일을 실행해 입력값으로 넣어보니 다음과 같이 정답 문자열이 출력되었다.
따라서 정답은 "Leteminman" 이다.
CodeEngn_Challenges Basic RCE L14
L14. Name이 CodeEngn 일때 Serial을 구하시오 (이 문제는 정답이 여러개 나올 수 있는 문제이며 5개의 숫자로 되어있는 정답을 찾아야함, bruteforce 필요) Ex) 11111
Name이 CodeEngn 일때 Serial을 찾는 문제이다. serial에 123을 넣었더니 잘못된 시리얼이라는 메시지박스가 뜬다.
파일 정보를 확인해보니 UPX로 패킹된 파일이다.
이전 문제에서 많이 했던 것처럼 디버거에서 언패킹을 진행행 OEP 부분을 찾아가본다.
POPAD 다음 jmp 401000이 OEP로 넘어가는 부분이다.
OEP는 401000이다. 여기까지 와서 문자열참조를 이용해 시리얼 번호가 있을 것 같은 곳으로 찾아간다.
"Good Job~" 문자열을 찾아왔다.
코드의 흐름을 보아 [401309-40132C]까지 입력한 Name의 문자 하나씩 연산하여 serial번호를 생성하는 loop문으로 보인다.
이후 입력한 serial번호(eax)를 가져와 16진수 값으로 바꾸고 생성한 번호(esi)와 비교하여
jne분기점에서 다르면 틀렸다는 문자열을, 맞으면 정답 문자열을 출력하는 것으로 보인다.
현재 입력한 serial 번호는 123=0x7B이고 esi로 가져온 스택의 값이 0x129A1 이므로 맞지 않았고,
정답 serial은 76193이다.
CodeEngn_Challenges Basic RCE L15
L15. Name이 CodeEngn일때 Serial을 구하시오
파일 정보를 확인해 본 결과 델파이로 구성된 파일이다. 델파이로 짜여진 파일은 처음인데 별 다를 거 없는 것 같다..?
디버거로 파일을 열어 "Try Again!" 문자열을 찾아가 보았다.
try again으로 오는 분기문에 bp를 걸고 실행했다.
45B844위치에 저장되어 있는 값=CodeEngn을 연산한 값=0x6160
이 값과 입력한 serial값의 16진수값이 같은지 비교하여 같으면 분기하지 않고 다르면 분기한다.
따라서 Name이 CodeEngn일 때 정답 Serial은 0x6160=24928이다.
CodeEngn_Challenges Basic RCE L16
L16. Name이 CodeEngn일때 Serial을 구하시오
L15번과 비슷한 문제인 것 같아서 같이 풀었다. dev C++로 만든 파일로 파일 구조만 다른 듯 싶다.
파일을 실행해보면 Name 부터 입력하면 password를 입력하라는 문자열이 나오고 순차적으로 정답 여부가 나온다.
역시나 디버거에서 "wrong password!" 문자열을 찾아갔다.
Name 문자열을 입력받고 문자열의 개수를 세어 연산에 이용한다.
(8+8 +8) <2 한 값=0x60을 [ebp-3C]에 넣고, 60*60 *60 +17 한 값=0xD8017을 다시 [ebp-3C]에 넣는다.
회색으로 드래그 한 부분이 Name 문자열을 이용해 연산하여 serial값을 생성하는 부분이다.
이후 password를 입력받고 한번 더 연산을 수행한다.
* imul에 인자가 3개이면 2, 3번째 인자를 연산하여 1번째 인자에 넣는다.
이때 edx가 4바이트이므로 연산한 값에서 32bit만큼 잘라서 들어가게 된다.
위에서 연산한 값(D8017)과 지금 연산한 값을 더한 값이 최종 serial값이 된다.
E4B88D80+D8017=E4C60D97
임의로 입력한 serial이 123=0x7B이었으므로 정답 serial 0xE4C60D97과 비교하여 정답이 아니므로 오답 문자열을 출력했던 것이다.
따라서 Name이 CodeEngn일 때 정답 serial은 0xE4C60D97=3838184855이다.
'Security > Reversing' 카테고리의 다른 글
Debugger software BP의 원리 (0) | 2021.09.08 |
---|---|
relocation과 .reloc섹션 (0) | 2021.08.28 |
[CodeEngn] Challenges Basic RCE L10, L11, L12 (0) | 2021.08.15 |
[CodeEngn] Challenges Basic RCE L07, L08, L09 (0) | 2021.08.09 |
[CodeEngn] Challenges Basic RCE L04, L05, L06 (0) | 2021.08.06 |
댓글