분류 전체보기 145

[Reversing.kr]Replace

바이너리를 실행시켜보면 아무거나 입력할 수 있는 창이 나온다. 아무거나 입력하고 Check 했더니 즉시 꺼져버렸다... ';;; IDA에 올려보도록 하겠다. WinMain 함수를 어렵지 않게 찾을 수 있었다. WinMain 에선 단서가 될 만한게 안보여서 string 을 검색한 결과 "Correct!" 라는 string이 있는 곳을 발견했다! 그와 동시에 DialogFunc 에서 거의 모든 action이 일어난다는 것을 알 수 있었다. 그리고 DialogFunc에서 메인역할을 하는 것 같은 sub_40466F 함수가 디컴파일이 잘 안된다는 것을 발견할 수 있었다. (alt + k 로 스택포인터 변경 불가) 아마 call 부분에서 정확한 주소가 아닌 오프셋을 5 추가한 부분을 call 하기 때문인 것 같다..

[Pwnable.xyz]add, misalignment

add, misalignment 둘 다 비슷한 성격의 문제라서 같이 쓴다. add 바이너리를 IDA에 올리면 main함수에 다른 사족은 제외하고 while 문 하나를 볼 수 있다. 요약하면 숫자 3개를 받아서 첫번째와 두번째 숫자를 더하여 array의 세번째입력 숫자 값의 인덱스에 저장하고 출력하는 로직이다. 플래그를 얻어낼 수 있는 함수는 win() 함수! 주소는 0x400822 10진수 정수로는 4196386 이다. 이제 단서들을 모았으면 어떻게 main함수에 없는 win 함수를 실행할 수 있을지 고민해보자. 고민하다보니 원래크기인 array[11]을 벗어나서 [-1] , [12] , [13] , .... 까지 입력이 가능하다는 것을 발견할 수 있었다. 지역변수들을 고려하여 스택 구조를 파악하면 ar..

[Reversing.kr]Music_Player

mp3를 재생시킬 수 있는 Music Player 가 있고 1분 미리듣기 기능이 디폴트로 설정되어있다.1분 제한 기능을 우회하면 플래그가 나온다고 써져있다. 며칠동안 고생했던 문제... 확실히 배운 점도 있다. 1. 이런 류의 문제는 ms 단위로 시간을 책정하는 편.2. IDA로 VB 디버깅 하는 법3. 삽질 능력 등등.... 우선 프로그램을 켜서 아무노래나 재생시키면 1:00 이 되자마자 MsgBox를 띄운다. VB는 올리가 편해서 처음에는 OllyDbg 로 깠는데 이상하게 파일 여는 과정에서 자꾸 오류를 뿜어서 어쩔 수 없이 IDA로 디버그를 진행하였다. (해보니까 올리보다 편했다는 후문! ) 일단 MsgBox를 call 하는 부분을 크로스레퍼런스로 조사 후에 다 브레이크를 걸어놓고진행시켰더니 위의 ..

[Insomni'hack 2019]Beginner_Reverse

[TMI]대회 당일에 몸이 안좋아서 하루종일 누워있다가 겨우 한 문제 풀었다. A babyrust to become a hardcore reverser 문제 설명에 나와있듯 이 바이너리는 rust라는 생소한 언어로 되어있었다.덕분에 rust 공부도 쵸큼 된 것 같다. ㅋㅋ(몰라도 대충 로직 분석으로 풀 수 있었지만...) 우선 Shift + F12 로 힌트가 될만한 문자열이 있는지 탐색해보았는데 "Submit this and get you'r points!" 라는 뭔가 정답을 알 수 있을 것 같은 문자열이 보였다. 이 문자열은 beginer_reverse::main 함수에 담겨져있으며 이 함수를 call 하는 main 함수에는 별다른 점이 없기 때문에 이 함수가 핵심 함수임을 알 수 있었다. 문자열이 박..

<보안 study>/CTFs 2019.01.28

[Reversing.kr]Easy Unpack

문제의 목적은 바이너리의 OEP(Original Entry Point) 를 구하는 것이다. 처음에 문제 제목을 까먹고 PE View에 나와있는대로 OEP를 적었다가 틀렸다 .. :) ;; ㅋㅋㅋㅋㅋ (Packing 된 상태의 OEP) OllyDbg 에서 search for all intermodular calls를 했더니 함수가 얼마 나오지 않는 것으로 미루어 짐작하면 패킹이 되어있음을 확실히 알 수 있다. 패킹 방식은 보다시피 나오지않는 유명하지않은 패킹 방식인듯 하다. 그러면 이제 생각할 것은 매뉴얼 언패킹을 시도하는 것이다. 확신할 수 있는 것은 패킹된 바이너리도 실행할 때에는 분명히 패킹으로 인해 변조된 OEP가 아닌본래의 OEP를 거쳐서 프로그램을 실행한다는 점이다. 우리는 그 점에서 매뉴얼 언..

[CodeEngn]Advance - 06 [다시풀자]

리버싱 실력이 딸려서 올리디버거로 풀진 못했다.... 우선 바이너리는 처음에 UPX 패킹이 되어있던 상태였는데 위 사진은 UPX를 언패킹 한 상태의 모습이다.처음에는 일반적인 Windows 바이너리인줄 알았는데. . . . . . 올리디버거에 올려서 디버깅하는 도중에 IsDebuggerPresent 가 걸리면서 이 바이너리는 AutoIt로 코딩되어있다고알려준다. 우회하고 올리디버거로 분석할 수 도 있었지만 계속 분석해도 안나와서 AutoIt 디컴파일러를 구해서분석할 수 있었다. 보다시피 남은 군생활은 790일인 것으로 알 수 있다. 이것을 md5 암호화 시켜서 인증하면 된다. 나중에 올리디버거로 다시 풀어보는게 좋을 것 같다. 추가적으로 AutoIt(오토잇)에 대해 설명하자면 Windows GUI에 범용..

[Reversing.kr]Easy Keygen

CodeEngn 에서의 대부분의 문제와는 달리 이번에는 시리얼을 단서로 Name을 구해내는 문제이다.Name에서 시리얼을 추출하는 로직을 알아내야겠다고 생각했다. Name을 입력한 후 반복문에서 시리얼 값을 만들어내는 부분을 찾아냈다.처음에 ECX에 들어가는 값은 스택에 있는 값으로 ESI가 0, 1, 2 로 늘어남에 따라 ECX에는 0x10, 0x20, 0x30이 들어가게 된다. EDX에 들어가는 값은 Name으로 입력한 input값을 한 바이트씩 잘라낸 것이다. 그리고 ECX와 EDX 두 개를 XOR 연산 시켜서 이것을 시리얼 값으로 만들어내는 것이다. 만약 ESI가 3이 된다면 0으로 초기화 시켜서 0x10~0x30 루틴을 유지하게 만들어 준다. (0x0019FE08 라인에서 끝에 10 20 30 ..

[CodeEngn]Advance - 05

비주얼 베이직으로 코딩된 바이너리이다.그래서 VB Decompiler를 이용하여 디컴파일 해보았으나 이렇다할 시리얼이나 함수 같은 것은찾지 못했다. 그래서 OllyDbg로 바로 올렸다. (구조체의 데이터 VB5!로 시작하는 시그니처가 보인다) 다른 비주얼 베이직 바이너리랑 똑같이 특정 구조체 하나를 인자로 하여 MSVBVM60.DLL 을 CALL한다.string을 서치해보았으나 성공했다는 문구나 시리얼을 찾을 수 없었다. 그래서 비교구문이 있겠거니하고 호출하는 함수목록을 찾아보다가 vbStrcmp 함수를 찾았고 브레이크를 걸었다. 보다시피 EAX는 텍스트박스에 입력한 input이고 이 값을 ECX의 "677345" 와 비교하여 성공인지 실패인지 분기한다. 따라서 시리얼은 677345 !!!

[CodeEngn]Advance - 02

C++ 로 코딩되어 있고 패킹은 되어있지 않다.IsDebuggerPresent 기법을 우회해야한다. (따로 우회과정사진 첨부는 없음) 바이너리를 실행하면 아무 것도 뜨지 않았다... 원래 이런 바이너리인줄 알았는데 풀고나서 보니 나만 오류가 있었던 것 같다. 이 부분에서 system32/kernelbase.dll 을 반복하면서 실행(?) 하는데 CMP 에서 비교하는 AX 값이 1171이 되어야 진짜 본 문제로 넘어간다.여기서 kernelbase.dll 이랑 kernel32.dll 에 대한 오류인지 모르겠으나 원래 문제에서 의도한 오류는 아닌 듯하다. 아무튼 JNZ를 JZ로 패치하면 본 문제로 잘 넘어간다. ㅇ _ ㅇ 문제에서는 패스워드를 입력하라고 했다. 여러 번 실행하다가 바이너리가 EDX 이후 종료되..

[CodeEngn]Advance - 01

Reversing Advance 01 번 문제이다. 프로그램의 실행하는 동안의 시간을 구하는 문제이다. 프로그램은 위와 같은 팝업창을 띄우고 몇 초 뒤에 알아서 종료된다... 디버깅 전에 PEiD로 프로그램 정보를 확인해보니 UPX로 패킹이 되어있다.UPX 언패킹 툴로 언패킹 해주자 :) 올리 디버거에 올려서 디버깅 하는 과정에서 자꾸 밑과 같은 오류 창이 뜨면서 종료가 된다. 진행 시키면서 확인해보니 IsDebuggerPresent로 안티디버깅이 되어있다. ※우회법 중 하나는 TEST EAX, EAX 를 CMP 구문으로 바꿔주는 것이다. 아무튼 코드 패치를 해주고 다시 저장해주자. ※ 코드 패치를 해준 다음 저장하는 방법은 오른쪽마우스 클릭 -> Copy to executable -> Selection..

반응형