728x90
  • Music Player

파일을 다운받아서 먼저 Readme 를 열어서 읽어 보니까 mp3 플레이어가 1분으로 제한되어 있는 것을 1분 이상으로 실행하도록 만드는 문제인 것같다.


같이 온 MP3 Player 실행파일을 실행해서 아무 음원이나 넣어봤다.


아니나 다를까 1분이 되면 알림창이 뜬다. 디버거 프로그램으로 열어주었다.

메시지 박스를 띄워 주는 함수를 먼저 찾기로 한다!!
왜냐하면 어떤 함수에서 "1분 미리듣기만 가능합니다." 메시지를 출력되는 것을 알면 출력이 되는 조건이나 과정을 알 수 있지 않을 까하는 생각에 일단 브레이크포인트를 모두 걸어 주고 실행해봤다.

실행하고 1분 재생이 끝나면 004045D8 주소에서 실행이 멈추는 것을 보고 이 004045D8 주소에 도달하지 않으면 1분 미리 듣기만 가능하다는 메세지가 출력이 안될 것이 아닌가!

여기서 낮선 명령어를 볼 수 있다.
Jl은 Jump if less의 줄임말로 비교 대상이 더 값이 작다면 점프하고, 그렇지 않다면 점프하지 않는다.
판단한 후 4045FE 함수로의 점프를 결정하는 것으로 보인다.

1분 미만일 때의 실행과정을 계속 실행하도록 해주기 위해 jl문을 jmp문으로 바꾸어 주었다.
(조건만족하지 않더라도=1분이상이더라도 점프하도록)

그런데 에러가 발생했다..

 

+) 오류 고친 문제풀이  
https://am0119.tistory.com/57
http://reversing.kr/challenge.php

 

[Reversing.kr] Music_Player

Music_Player 이 예제는 파일을 다운받아서 먼저 Readme 를 열어서 읽어 보니까 mp3 플레이어가 1분으로 제한되어 있는 것을 1분 이상으로 실행하도록 만드는 예제로 다운받은 파일에 MP3 Player 실행파일

am0119.tistory.com

 

Reversing.Kr

Copyright © 2012-2022 Gogil All Right Reserved.

reversing.kr


  • rev-basic-4


오랜만에 dreamhack rev-basic 문제를 풀게 되었다. 이전 예제들과 동이라게 correct를 출력하는 입력값이 곧 flag 값이다!!


프로그램을 실행하게 되면 아무 입력값을 넣으면, wrong이 출력되고 종료된다. 그렇다면 IDA 프로그램에서 프로그램을 분석해보자.


IDA 소스코드를 봤을 때 correct 메세지가 뜨는 성공 조건을 확인하기 위해 sub_14001000 함수를 확인해보자.


if 문의 조건에 있는 식을 보고 처음에는 뭐지 했었다. 일단 unsigned_int8는 데이터 형식이니까 제외하고,

((16 * *(_BYTE *)(a1 + i)) & 0xF0 | ((int)*(a1 + i) >> 4)) != byte_140003000[i]


입력한 값을 a라고 가정하고 a1을 a라 가정하고 풀어보자.

첫 번째 a1+i >> 4 부분,
>> 는 비트 이동 연산자로 >> 4 는 오른쪽으로 4번 이동하라는 의미다. 그래서 아스키 코드 값으로 a는 97이기 때문에 이걸 이진수로 변환하면 110 0001, 이걸 오른쪽으로 4비트 움직이면, 110이 된다.


두 번째, (16 * a[i]) & 0xF0 부분

16 * (a1+i)는 바꾸면 16 * 97고 값은 1552(10진법) 이진수로 바꾸면 110 0001 0000 이 된다. 근데 이값을 보게 되면 97의 2진수 값에서 왼쪽으로 4번 움직인 것과 같은 결과가 나왔다.


610 (16진수)& 0xF0 부분을 계산하면은 110 0001 0000 & 1111 0000 =  0000 0001 0000 값이 나온다!!

세 번째, (16 * a[i]) & 0xF0 | a1[i] >> 4

이제 마지막 연산이다. (16 * a[i]) & 0xF0 = 0000 0110  이고 a1[i] >> 4 = 0001 0000 이거 두개를 연산하면 = 0001 0110

이 때, 'a'의 2진수 값과 계산 결과 값이 앞 뒤가 바뀐 것을 알 수 있다.
즉, 값의 앞 뒤를 바꾸는 연산이다.

byte_140003000 값을 확인하게 되면 27자리 데이터가 있다.



이 27자리 데이터를 함수에 넣어주면 값이 나오게 된다.

#include <stdio.h> int main(){ int byte_140003000[27] = { 0x24, 0x27, 0x13, 0xC6, 0xC6, 0x13, 0x16, 0xE6, 0x47, 0xF5, 0x26, 0x96, 0x47, 0xF5, 0x46, 0x27, 0x13, 0x26, 0x26, 0xC6, 0x56, 0xF5, 0xC3, 0xC3, 0xF5, 0xE3,0xE3}; for(int i = 0; i<27; i++){ printf("%c", (16 * byte_140003000[i]) & 0xF0 | (byte_140003000[i] >> 4)); } return 0; }


이 코드를 넣어주면 Br1ll1ant_bit_dr1bble_<<_>> 이 나오게 된다. 이걸 입력값에 넣어주면 correct가 뜬다!!

 



https://dreamhack.io/wargame/challenges/18/

 

rev-basic-4

Reversing Basic Challenge #4 이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다. 해당 바이너리를 분석하여 correct를 출

dreamhack.io

 

+ Recent posts