목록Reversing/Wargame (17)
Iriton's log
프로그램을 실행해 보니 그림판처럼 사용자가 그림을 그릴 수 있다.Check 버튼을 누를 때 Wrong 이라고 뜨는 걸 보니,Flag와 연관이 있을 것이라 생각하고 올리디버거를 열었다. Wrong 문자열이 사용되는 함수로 이동하여 살펴 보기로 했다. 보니까 Wrong 메세지 박스를 띄우기 전에 어떤 분기문에 의해 점프한 것을 볼 수 있다.DL과 BL을 비교하는 비교연산자 CMP가 보인다.그럼 이 DL과 BL은 어디서 온 무슨 값인지 알아 보기 위해 코드를 역순으로 읽어보며 파헤쳐 봤다. 여기서 MOV 명령어로 오른쪽 값을 왼쪽에 넣는다. 즉 ECX와 EAX 값에 초점을 두면 된다.코드를 살펴 본 결과 EAX와 ESI의 대조를 추측했지만 그건 너무 복잡해져서 구글링을 해 봤다.그 결과 PEview가 필요해서..
1분 재생만 되는 MP3 Player를 1분 이상 재생시켜서 flag를 얻어야 한다. PEiD로 열어 보니 따로 패킹되진 않았다. 프로그램을 실행시켜서 원하는 MP3 파일을 열었더니 1분이 됐을 때 팝업창이 떴다. 이제 올리디버거로 파일을 열어 봐야겠다. 근데 올리디버거로 프로그램을 실행시켜서 MP3 파일을 열려고 할 때 프로그램이 정지되는 현상이 있었다.백신프로그램이랑 충돌해서 그렇다고 한다. 백신 프로그램을 꺼도 프로그램이 정지되는 걸 보아 코드나 연동 부분에 문제가 생긴 듯하다.그래서 open을 사용하지 않고 직접 경로를 입력해 주고 재생하였다.이렇게 했더니 이번엔 디버거가 멈췄다... 어쩔 수 없이 구글링 해서 다른 사람들이 찾아둔 주소로 이동해서 문제를 풀었다. CMP로 60000ms(올리디버거..
컴퓨터 C 드라이브의 이름이 CodeEngn 일경우 시리얼이 생성될때 CodeEngn은 'ß어떤것'으로 변경되는가 프로그램을 실행하면 시리얼 넘버를 입력하라 하고틀린 값 입력시,the serial you entered is not correct!문자열을 띄운다. 이번에도 디버거로 열어서 all referenced text string을 확인한다. 맨 위에 두 값이 시리얼 넘버 같은데 일단 해당 오류 메세지로 가보자 시리얼 넘버로 추측했던 문자열이 나오는 context를 보면 stringtoadd 즉 문자열에 추가가 되는 형식인 거 같다.어떤 동작을 하는지는 직접 실행해보면서 확인해 봐야겠다. 처음엔 GetVolumeInformation 함수로 인해 디스크 이름을 가져오고 그 뒤에 4563-ABEX 문..
비주얼베이직에서 스트링 비교함수 이름은? exe 파일을 실행하면 어떤 값을 입력하라고 뜬다아무거나 입력하면 Error가 뜨는데 이때 쓰이는 함수가 뭔지 맞추라는 거 같아서 이뮤니티디버거로 열어서 Search for - All referenced text strings 로 들어가서 해당 텍스트가 어디있는지 찾기로 했다. 좀 내려보면 해당 메세지를 확인할 수 있다.그 위에 수상한 문자열 2G... 가 있는데 일단 넘어가자. 더블 클릭하여 해당 context로 넘어가 보니 어떤 함수를 부른다. 저 함수가 맞는지 모르니까 일단 위 흐름을 살펴보자.아까 수상하다던 문자열이 스택에 저장되고 strcmp 함수를 호출한다.bp를 걸어두고 확인해 보면,스택에 내가 입력한 값이랑 해당 문자열이 쌓이고 함수가 호출된다.s..
simple-operation Description 우리의 친구 아모가 미션을 주었습니다. "내가 원하는 결과가 나오도록 값을 입력해 줘!" 주어진 바이너리를 분석하고 알맞은 값을 입력하면 플래그가 출력됩니다. 플래그는 flag 파일에 dreamhack.io 풀이 코드의 흐름을 먼저 보자. 17-20: flag 파일을 열어서 파일 디스크립터를 fd 변수에 담는다. 45바이트만큼 읽어서 buf 변수에 받고 다시 닫는다. 21: 난수를 v6에 저장한다. 24: v7에는 사용자 입력값을 받는다. 25: v6 ^ v7 은 XOR 연산을 의미한다. 26: snprintf 함수는 출력 결과를 문자열 버퍼에 저장하는 함수이다. 버퍼의 크기를 지정하여 버퍼 오버플로우를 방지하는데 여기서는 9uLL로 지정했다. 9는 버..
실행 화면은 #0과 같은 프로그램이어서 어김없이 문자열을 찾아서 해당 코드로 이동했다. 0번 문제처럼 구성되어 있다. 분기점 전 호출되는 함수로 이동해 보자. eax와 문자를 하나씩 비교하는 것으로 보인다. 저 문자를 다 조합하다 보면 Compar3로 시작하는 Flag 값이 나온다. 문자열이 다 흩어져 있다는 걸 제외하면 #0, #1 둘 다 같은 난이도로 너무 쉬웠다. 그치만 어셈블리코드 분석 자체로 의미 있는 풀이였다.
문제 파일을 다운로드 하고 기존 사용하던 올리디버거로 파일을 열었는데, 실행이 안 됐다. 새로운 디버거 x64dbg를 설치하니 실행이 잘 됐다. 프로그램을 실행하면 그냥 Input: 이 뜨고 내가 문자를 입력하면 자동 종료가 된다. 디버거를 열어서 문자열 검색을 진행했다. 내가 찾으려고 한 건 Input이기 때문에 해당 코드로 이동한다. 어떤 함수를 호출하고, test 명령어가 나온 후 Correct와 Wrong으로 나뉜다. eax 값을 검사하여 값이 0이면 Wrong, 1이면 Correct를 띄우는 것이다. (TEST 연산이란 두 피연산자 사이에 AND 연산을 하고, 결과가 0인 경우 ZF가 1로 세팅되지만 결과값을 저장하지는 않는다. 단독 사용은 불가하며 JMP문과 같은 이동 명령어와 함께 사용된다...
Name이 CodeEngn일때 Serial을 구하시오. 풀이 올리디버거를 열어 무작정 한줄 실행을 하다보니 CALL 함수가 실행되고 아무것도 없던 화면에 문구가 떴다. Enter your Name 이라는 문구를 띄우는 코드 근처로 가서 분석해 보기로 했다. EAX와 EBP-3C와 비교하고 점프문이 실행된다. 비교문에 BP를 걸어두고 재실행하여 레지스터 값을 비교해 보았다. EAX엔 사용자 입력값이 저장됐다. EBP-3C 주소를 찾으면 된다. 70FEEC 주소로 가면 된다. 여기서 4바이트만 긁어서 변환해 주면 된다. 이때 리틀엔디언으로 표현되어 있기에 순서를 바꿔서 E4 C6 0D 97을 변환해야 하는 것에 유의해야 한다.