문제
페이지 소스코드

unlock 변수에 정말 긴 값이 들어가 있다.

그리고 저 값을 빈 칸에 넣어주면 풀리는 문제이다.

 

 

콘솔 창 이용!!

콘솔 창을 이용하면 아무리 복잡한 계산도 단번에 가능하다.

해결

문제
페이지 소스코드

6) 일단, 움직이는 대상의 id가 star라는 점을 기억하자. 

 

18) kk() 함수 ~

Math.random() : 0 이상 1 미만의 난수 생성 

Math.floor() :  주어진 숫자와 같거나 작은 정수 중에서 가장 큰 수를 반환

--> 19번째 코드에서 색상을 나타내는데 쓰이는 6자리 숫자 만들기 위함

 

19) (x,y) 좌표에 랜덤의 색상을 가지는 * 모양 찍기

 

10) mv() 함수가 실행될 때마다 kk() 함수가 작동하여 해당 위치에 * 문자열을 찍게 된다.

9) mv() 함수를 이해하기 위해선 4번째 줄에 있는 onkeypress() 함수를 먼저 알아야 한다.

 

onkeypress(ASCII 값) : 사용자가 키보드를 눌렀을 때 해당하는 자바스크립트 수행

 

11) onkeypress에 들어가는 ASCII 값이 100 이라면? 이것은 키보드 'd'를 눌렀을 때를 의미

이러면 star의 left 좌표가 50px 씩 커지며 오른쪽으로 이동한다.

 

12) 키보드 'a'를 눌렀을 때

13) 키보드 's'를 눌렀을 때

14) 키보드 'w'를 눌렀을 때

 

이리저리 움직인 결과

 

그러면 우리는 ASCII 값이 124에 해당하는 키보드( | )를 눌러주면 문제를 해결할 수 있다.

 

 

문제
페이지 소스코드

12번째 줄부터 18번째 줄이 핵심이다.

13) ul 변수에 이 페이지의 URL을 넣고

14) ul 변수에 ".kr" 문자열이 처음 등장하는 인덱스를 넣고

15) ul 변수에 그 인덱스에 30을 곱한 값을 넣는다

16) 입력한 값과 ul이 같다면 풀리는 문제

 

URL 확인 후 pw 입력
해결

 

 

 

들어가자마자 alert 창이 뜬다

들어가자마자 Access_Denied라는 문자열을 띄우는 alert 창이 뜬다. 

클릭하면 Webhacking.kr 의 index 페이지로 넘어간다.

 

 

이는 alert를 띄우는 자바스크립트를 무력화시키면 되는 문제이다.

 

크롬 상단 메뉴
'자바스크립트' 검색 후 클릭
차단 목록에 추가

 

차단목록에 추가하면 아래와 같은 소스코드가 정상적으로 나온다.

페이지 소스코드

URL에 ?getFlag를 적으면 풀릴 것 같다.

 

성공

문제

 

페이지 소스코드 확인

놀리고 있는 것 같다.

 

<script> 태그 내에 아래와 같은 문자가 있다.

゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) 

자바스크립트가 난독화된 것 같다.

 

콘솔창에서 실행

이를 콘솔창에서 그대로 복붙하여 실행해주었다.

이렇게 하면 오류가 나는데, 마지막 ( '_' )

이 부분을 그냥 으로 고쳐서 입력하면 난독화 된 코드가 보인다.

 

해석된 코드

이를 더블클릭하여 함수를 확인해본다.

 

anonymous 함수

※ substr()

:: 파라미터로 입력받은 start index부터 length 길이만큼 string을 잘라내어 반환하는 함수

첫번째 글자의 index는 0에서 시작

 

※ indexOf()

:: 해당 문자열의 인덱스 값을 반환하는 함수

 

※ fromCharCode

:: 아스키코드 번호를 받아 문자열을 구성해주는 함수

 

※ charCodeAt

:: 주어진 인덱스에 대한 UTF-16(유니코드 문자 인코딩 방식의 하나)코드를 나타내는 0부터 65535 사이의 정수를 반환 /

문자열중 하나를 선택하여 아스키코드 번호로 변환해주는 함수

 


if(ck=="="+String.fromCharCode(enco_(240))+String.fromCharCode(enco_(220))+String.fromCharCode(enco_(232))+String.fromCharCode(enco_(192))+String.fromCharCode(enco_(226))+String.fromCharCode(enco_(200))+String.fromCharCode(enco_(204))+String.fromCharCode(enco_(222-2))+String.fromCharCode(enco_(198))+"~~~~~~"+String.fromCharCode(enco2)+String.fromCharCode(enco3)){
  location.href="./"+ck.replace("=","")+".php";

만약 ck 가 어떤 값이라면 ./어떤 값.php로 페이지가 이동하는 것을 알 수 있다.

 

 

콘솔 창의 편리함을 알 수 있는 문제,,!

더보기

Console

:: 실시간으로 자바스크립트를 실행하고, 에러 메시지등을 출력해주는 기능이다.

 

https://opentutorials.org/course/580/2872

 

console 창에 함수를 입력한 후 문자열을 해석해본다.

따라서 ck는 =youaregod~~~~~~~! 임을 알 수 있었다.

 

=를 NULL로 바꾼 후 URL 주소에 이를 입력해줬다.

 

성공

 

문제
페이지 소스코드

GET 요청시 val이라는 파라미터 안에 $pat 변수의 값을 넣어줘야 풀리는 문제이다.

 

$pat = /[1-3][a-f]{5}_.*$_SERVER[REMOTE_ADDR].*\tp\ta\ts\ts/

 

pat 변수는 정규표현식으로 나타나 있다.

 

[1-3] 은 1,2,3 문자 중 어떤 하나를 의미한다.

[a-f] 은 a,b,c,d,e,f 문자 중 어떤 하나를 의미한다.

{5} 는 앞에 나온 표현식을 5번 반복하라는 의미이다. (a,b,c,d,e,f 중 하나)

.* ~ .*는 .* 뒤에 0개 이상의 문자열을 .*이 나올 때 까지 반복하라는 의미이다.
\t 는 탭(tab)을 의미한다.

 

즉, 1aaaaa_IP주소(탭)p(탭)a(탭)s(탭)s 를 넣어주면 될 것 같다.

 

URL에 들어가는 특수문자는 URL 인코딩 방식된 형태로 넣어줘야 한다.

탭(\t)은 URL 인코딩하면 %09 이다.

 

문제화면

 

숨겨진 오른쪽 화면. Goal 지점이 보인다.
마우스를 갖다댈 떄의 모습.

마우스를 갖다대면 O라고 적혀있던 문자가 yOu로 바뀐다.

그리고 이를 클릭하면 오른쪽으로 전진한다!

 

클릭해서 Goal 지점으로 들어가게 하니까 문제가 풀리긴 했지만 소스코드를 분석하여 문제를 풀어보겠다.

 

페이지 소스코드

 

<a id=hackme style="position:relative;left:0;top:0" onclick="this.style.left=parseInt(this.style.left,10)+1+'px';if(this.style.left=='1600px')this.href='?go='+this.style.left" onmouseover=this.innerHTML='yOu' onmouseout=this.innerHTML='O'>O</a><br>
<font style="position:relative;left:1600;top:0" color=gold>|<br>|<br>|<br>|<br>Goal</font>

hackme.style.left가 클릭할 때마다 1px 씩 증가하며,

그 값이 1600px가 되면 문제를 풀 수 있는 링크가 생성되는 것 같다.

 

URL에 ?go='1600px'를 덧붙여 이동한 결과

그 결과, no hack이라는 문자열이 뜬다.

작은 따옴표 없이 ?go=1600px라고만 해도 같은 결과가 나오며 ?go=1600 이라고만 해도 같은 결과가 나온다.

 

콘솔창

hackme.style.left가 1600이 되는 순간에 문제가 해결되므로 

콘솔창을 통해서 hackme.style.left=1599로 설정해주면 O가 Goal 지점 부근에 가있는 것을 볼 수 있다.

이를 한번 더 클릭하면!

해결

 

문제

RegisterKEY 값을 찾는 문제이다.

 

 

PEiD로 확인

Delphi라는 언어로 작성된 코드라고 한다.

정상적 실행 파일인가보다.

 

처음 코드

정상적인 코드이다.

 

[마우스 우클릭]-[Search For]-[All referenced text strings]

실행 파일에 쓰인 문자열들을 확인해봤다.

Congratulation 문자열이 먼저 눈에 띄었고, 

뭔가 힌트가 될만한 문자열 (2V, XS, B6, H1, 0F)이 눈에 띄었다.

 

 

해당 문자열이 있는 곳으로 가서 어셈블리 코드를 확인했다.

 

PUSH DWORD PTR DS:[EBX+310]

PUSH DWORD PTR DS:[EBX+318]

PUSH DWORD PTR DS:[EBX+31C]

PUSH DWORD PTR DS:[EBX+314]

PUSH DWORD PTR DS:[EBX+320]

 

PUSH 명령어로 해당 값을 스택에 순서대로 넣고 있다.

따라서 레지스터 키 값을 2VB6H1XS0F 라고 예상해볼 수 있다.

 

Congratulation 문자열이 나오기 전 점프 명령어에 BP를 걸고 실행

레지스터 키 값을 입력하는 곳에 asdf 라는 문자열을 입력했더니 

EAX에 asdf가 들어가고

EDX에는 2VB6H1XS0F가 들어가는 것을 확인할 수 있다.

 

따라서 예상한 키 값이 맞는 것 같다.

성공

'Study > Reversing' 카테고리의 다른 글

리버싱 기초 & reverseMe.exe 분석  (0) 2021.09.28
악성코드 유형  (0) 2021.09.18
Reversing.kr _Easy Unpack 풀이  (0) 2021.05.18
CodeEngn Challenge : Basic RCE L14  (0) 2021.05.11
[HackCTF] Reversing Me 풀이  (0) 2021.05.11

Easy_UnpackMe.exe 실행 시 화면

프로그램 실행 시 아무런 동작을 하지 않고 하얀 화면만 뜬다.

 

ReadMe.txt 확인

ReadMe.txt 를 확인해보니 OEP를 찾는 문제인 듯하다.

 

PEiD 실행 결과

PEiD에 넣어보니 EP Section도 비정상적이며, 컴파일 환경도 보이지 않는 것으로 보아 

패킹된 파일임을 짐작할 수 있다.

OllyDBG 실행

OllyDBG를 실행시켜보니 역시나 Entry Point의 문제에 대해 경고창을 띄우고 있다. 

패킹이 된 파일임이 확실하다.

 

처음 코드

코드의 처음 부분이다.

여태껏 봐왔던 시작 코드와는 다른 느낌.

그리고 계속 의미없는 반복문, 분기문이 계속되는 것을 확인할 수 있었다. 

 

수많은 분기문 맨 끝 JMP 문에 있는 주소를 확인했다.

이게 OEP 주소인 듯 싶다.

 

[F8키]로 확인

JMP 00401150 명령어를 실행시켜 해당 주소로 가보니

어셈블리 코드가 보이지 않는다.

따라서 OllyDBG의 코드 재분석 기능(Ctrl+A)를 사용하여 코드를 재분석해보았다.

 

코드 재분석

PUSH EBP 코드가 나온다.

00401150이 OEP 주소가 맞다보다.

 

OllyDump 기능 이용하여 덤프파일 뜨기

 

PEiD 재확인

덤프 뜬 파일을 PEiD로 재확인한 결과, 정상적인 결과로 나온다.

따라서 00401150이 OEP가 맞다.

오잉

'Study > Reversing' 카테고리의 다른 글

악성코드 유형  (0) 2021.09.18
Suninatas_11번 문제 풀이  (0) 2021.05.19
CodeEngn Challenge : Basic RCE L14  (0) 2021.05.11
[HackCTF] Reversing Me 풀이  (0) 2021.05.11
CodeEngn Challenge : Basic RCE L11  (0) 2021.05.06

문제

Name이 CodeEngn일 때 Serial을 구하는 문제이다.

 

실행결과

잘못된 Serial 값을 입력하면 위 그림과 같은 창이 뜬다.

 

PEiD 로 패킹여부 확인

PEiD로 패킹여부를 먼저 확인했다. 확인한 결과, UPX로 패킹되어 있는 것을 알 수 있었다.

따라서 UPX 툴을 사용해 먼저 언패킹 시켜주었다.

 

UPX 툴로 14.exe 언패킹

 

[우클릭] - [Search for] - [All referenced text strings]
위의 그림 결과

그 결과, 프로그램에 사용된 문자열들이 보였다.

성공 문자열이 있는 곳으로 가 코드를 확인해 보겠다.

 

분기문 확인

CMP로 EAX와 ESI 값을 비교한 후 JNZ 분기문을 통해서 성공/실패 문자열이 가는 곳이 나뉘어 진다. 

따라서 CMP 문이 있는 곳에 BP를 걸고 실행을 했다.

 

 

CodeEngn, 1234를 입력하고 BP를 건 곳까지 실행했을 때,

EAX에는 우리가 입력한 1234가 HEX 값으로 저장되어 있다는 것을 확인할 수 있었다.

 

 

따라서 ESI에 있는 값도 확인한 결과, 10진수로 76193이라는 값이라는 것을 알았다.

 

성공~

'Study > Reversing' 카테고리의 다른 글

Suninatas_11번 문제 풀이  (0) 2021.05.19
Reversing.kr _Easy Unpack 풀이  (0) 2021.05.18
[HackCTF] Reversing Me 풀이  (0) 2021.05.11
CodeEngn Challenge : Basic RCE L11  (0) 2021.05.06
CodeEngn Challenge : Basic RCE L10  (0) 2021.05.06

+ Recent posts