Reversing.kr의 문제 WindowsKernel입니다. 커널 디버깅을 요구하는 문제지만 저는 정적 분석으로 해결했습니다. 커널 분석으로도 풀어봐야겠습니다. WindowKernel.exe 파일과 WinKer.sys 파일이 있습니다. WindowKernel.exe 파일을 실행시켜보면, 원래는 입력하는 칸이 뜨는데 윈도우 10과 제 vmware 윈도우 7에서는 에러가 뜨네요. IDA로 분석하겠습니다. Check 버튼을 누르면 입력받은 값을 기준으로 WinKer.sys가 로드되며 통신을 합니다. 결과값이 1일 경우에 "Correct!"를 반환합니다. 이제 WinKer.sys 파일을 분석해보겠습니다. READ_PORT_UCHAR이라는 함수를 통해서 키보드 스캔 코드를 읽어옵니다. 호출 순서는 DriverE..
IDA와 올리디버거로 지뢰찾기를 분석해서 지뢰찾기 게임의 맵 정보를 찾았습니다. 이 부분을 검색해서 실시간으로 게임의 맵 정보를 출력해주는 맵 핵 프로그램을 만들었습니다. 아래는 프로젝트의 소스코드입니다. 자세한 코드 설명은 주석에 달아놓았습니다! ※github : https://github.com/A6ly/WinmineMapHack #include #include #include #include #include #include #define BUFFER_SIZE 512 #define MAP_SIZE 700 typedef struct { BYTE MaxWidthX; BYTE MaxHeightY; BYTE ALLMineCount; }GameInfo; const unsigned int ADR_MINE_MEM..
CodeEngn Advance RCE의 06번 문제입니다. 남은 군 생활이 며칠인지 구하는 문제네요.. 프로그램을 실행시키고 확인 버튼이나 닫기 버튼을 누르면 숫자가 1씩 계속 올라갑니다. 닫기 버튼을 눌러도 종료되지 않아서 작업 관리자에서 강제로 종료시켜야 했습니다. PEID로 확인해보니 UPX 패킹이 되어 있네요. 언패킹을 해준 뒤 올리디버거로 분석하겠습니다. 안티 디버깅 함수인 IsDebuggerPresent를 만나서 간단하게 우회해주었습니다. IsDebuggerPresent 함수를 우회한 뒤 함수 목록을 보니 아까 안 보였던 MessageBoxW 함수를 찾을 수 있었습니다. 모든 MessageBoxW 함수에 BP를 걸고 실행시켜보겠습니다. 실행시켜보니 45E071에서 브레이크가 걸렸습니다. 스택 ..
CodeEngn Advance RCE의 05번 문제입니다. Serial을 구하는 문제입니다. 프로그램을 실행시키고 아무 값이나 친 뒤 오케이를 누르면 이런 화면이 나타납니다. Visual Basic으로 만들어진 프로그램이네요. 올리디버거로 직접 분석하겠습니다. Visual Basic에서 문자열을 비교해주는 함수인 vbaStrCmp를 찾았습니다. 이곳에 BP를 걸고 실행시켜보겠습니다. EAX에 있는 제가 입력한 값 1234와 ECX에 있는 값인 677345를 비교하고 있습니다. 677345를 프로그램에 인증해보겠습니다. 정답이네요. 코드엔진 사이트에도 인증해보겠습니다. ~
CodeEngn Advance RCE의 04번 문제입니다. 3번 문제와 똑같이 Name이 CodeEngn 일 때의 Serial을 구하라고 하네요. 프로그램을 실행시켜서 시리얼 칸에 아무 값이나 넣어보았더니 실패 문자열이 출력됩니다. 올리디버거로 열어서 분석하겠습니다. 올리디버거 내에서 문자열과 함수 목록이 제대로 보이지 않는 것을 보니 패킹이 되어있는 것으로 보입니다. 한 줄씩 실행시키다 보니 401006이 OEP라는것을 알 수 있었습니다. OEP를 제대로 맞춰주고 덤프를 해주었습니다. strcmp 함수를 이용해서 사용자가 입력한 시리얼값과 어떤 ㅁ값을 비교하고 있습니다. 저 값을 프로그램에 인증해보면.. 정답입니다! 코드엔진 사이트에도 인증해보면.. !!
CodeEngn Advance RCE의 03번 문제입니다. Name이 CodeEngn 일 때의 Serial을 구하라고 하네요. 시리얼 칸에 아무 문자열이나 넣어보니 역시 실패 문자열이 출력됩니다. 올리디버거로 열어서 분석해보겠습니다. 성공 문자열로 보이는 곳으로 가보겠습니다. SEH (Structured Exception Handling)란 Windows OS에서 제공하는 예외처리 방식입니다. 언어 중립적이어서 범용적인 사용이 가능하며, 0으로 나누기나 유효하지 않은 메모리 주소 접근 같은 하드웨어 예외를 알아서 감지하고 처리하도록 도와줍니다. SEH가 있는 것으로 봐서 어떤 예외가 발생하면 이곳으로 분기해서 성공 문자열을 출력해주는 것으로 보이네요. 그럼 이제 실패 문자열이 출력되는 곳으로 가보겠습니다..
CodeEngn Advance RCE의 02번 문제입니다. 정답을 구하라고 하네요. 프로그램을 실행시켜보면 패스워드를 입력받습니다. 올리디버거로 열어서 분석해보겠습니다. "Enter Password: "를 출력하고 004012D2에서 문자열을 입력받고 있습니다. 계속 밑으로 내려가 보겠습니다. 루틴 하나를 지나고 004013C5에서 EDX를 호출하여 프로그램을 종료시킵니다. F7키를 이용하여 EDX 안으로 들어가 보겠습니다. ECX와 특정 값들을 비교하고 ZF가 0이라면(ECX와 비교하는 값이 다르다면), 0012F88A로 점프하고 있습니다. 0012F88A로 점프하고 한 줄씩 실행시키다 보면 ECX를 호출해서 프로그램을 종료시켜버립니다. 그렇다면 위에서 ECX와 비교하는 값들을 문자로 변환시키고 패스워..
CodeEngn Advance RCE의 01번 문제입니다. 프로그램이 몇 밀리세컨드 후에 종료되는지를 묻고 있습니다. 문제 파일을 실행시켜보니 이런 화면이 나타납니다. PEID로 보겠습니다. UPX로 패킹 되어있네요. 언패킹 한 후 올리디버거로 열어서 분석하겠습니다. 모든 timeGetTime 함수에 BP를 걸었습니다. 윈도우가 시작되고 난 뒤 지난 시간을 DWORD형 데이터로 얻는 timeGetTime 함수는 윈도우가 시작되고 난 뒤의 시간을 리턴합니다. 리턴값은 보통 EAX에 저장됩니다. EAX와 비교하는 부분을 찾아야겠네요. EAX와 비교하는 구문을 찾았습니다. DWORD PTR DS : [EBX+0x4]에 있는 값인 337B와 EAX를 비교해서 같으면 프로그램이 종료됩니다. 337B를 10진수로 ..
Reversing.kr의 문제 CSHARP입니다. 문제 이름처럼 C# 문제입니다. 문제 파일을 실행시켜보면, 알맞은 정답을 알아내면 되는 문제입니다. dnSpy로 문제 파일을 분석하겠습니다. 'MetMett'라는 함수가 있는데 동적으로 호출되고 있어서 호출도 안 되고 디버깅도 안 됩니다. .ctor은 프로그램이 실행되면 자동으로 실행되는데, 이곳에서 MetMett 함수를 복호화시켜주는 것으로 보이는 코드를 찾았습니다. 이 부분에 BP를 걸고 복호화 후에 값을 확인해보겠습니다. 정말 MetMett 함수 부분의 값이 바뀌었습니다. 복호화된 부분을 그대로 복사해서 HxD에서 수정해주겠습니다. HxD에서 MetMett 함수 부분의 값을 수정했습니다. 이제 프로그램을 다시 dnSpy로 열어서 확인해보면.. Met..
2018 HackingCamp CTF의 SWAP WORLD라는 문제입니다. 문제 파일을 IDA로 분석하던 중에 이상한 문자열을 찾았습니다. 상당히 수상해 보이네요. 저 문자열이 사용되는 곳으로 가보겠습니다. 수상한 문자열을 복호화 시켜준 뒤 출력시켜 주네요. 아마 flag 같습니다. 위 코드를 이용해서 저 문자열을 복호화시켜주는 코드를 짜보겠습니다. print bytearray([x^5 for x in bytearray("MFDHU~\\5pZNkjrZ!RDUZRJWIAx")]) 이 코드를 실행시켜보면.. flag가 출력됩니다!
2018 HackingCamp CTF의 PPAP라는 문제입니다. 문제 파일이 jar 파일이네요. 자바 디컴파일러로 열어보겠습니다. 그런데 아무것도 보이지 않네요.. CFR 자바 디컴파일러로 직접 문제 파일의 소스코드를 추출하겠습니다. 숫자들이 담겨있는 엄청나게 긴 배열이 나왔습니다. 저 배열 안에 있는 숫자들을 문자로 바꾸고 파일로 만들어보겠습니다. 배열 안에 있는 숫자들과 0xff를 & 연산해주어서 문자로 만든 뒤 arrby.class 파일에 저장했습니다. arrby.class 파일의 내용을 확인해보겠습니다. 입력받은 문자열의 길이와 내용이 flag와 같다면 배열 안에 있는 값들을 복호화시켜준 뒤 flag를 출력하는 프로그램이군요. 이 코드를 이용해서 flag를 출력해주는 코드를 짜보겠습니다. from..
2018 HackingCamp CTF의 CSdroid라는 문제입니다. "이것은 자바?" 제가 이 문장 때문에 자바 코드 쪽을 봐야 하는 문제인 줄 알고 삽질 엄청 했죠.. ㅠㅠ 파일을 다운로드 받으면 CSdroid라는 apk 파일이 나옵니다. 이 파일을 가상 안드로이드 환경에서 실행시켜주면, 이런 화면이 나옵니다. 체크 버튼을 누르면 "WRONG"이라는 문자열밖에 출력되지 않습니다. apk 파일 안에 여러 개의 dll 파일들이 있는데 그중에 CSdroid.dll 파일을 분석해보겠습니다. MainActivity를 보니 flag가 출력될 수 없게 되어있네요. 저 코드를 이용해서 flag를 출력하는 코드를 파이썬으로 짜보겠습니다. text = bytearray(34) text[6:10] = "2017" tex..
2018 HackingCamp CTF의 EZ라는 문제입니다. 매우 쉽다네요 ㅎㅎ C#으로 만들어진 8x8 타일들이 있는 프로그램입니다. 누르지 않으면 흰색, 누르면 검은색으로 바뀌는 타일들입니다. reflector로 열어서 분석해보겠습니다. Clicked 함수를 보니 '1110011110100101111001111000010001000111101001011110011110100100' 일 때 성공 문자열을 복호화한 후 출력한다고 합니다. 이 숫자를 8x8로 맞추고 1은 검은색 0은 하얀색으로 맞춰주면 저런 그림이 나옵니다. EZ 프로그램에 있는 타일을 저렇게 맞춰주면.. 플래그가 출력됩니다!
Reversing.kr의 문제 HateIntel입니다. Intel을 미워한다네요.. ㅎㅎ 문제 파일을 다운로드 받아보면 HateIntel 파일과 ReadMe 파일이 있습니다. ReadMe 파일을 메모장으로 열어보면, 패스워드를 찾으라고 합니다. 먼저 HateIntel 파일을 HxD로 열어보겠습니다. 처음 보는 파일 시그니처길래 찾아보았더니 OS X 실행 파일의 시그니처였습니다. 그렇다면 OS X에서만 실행할 수 있다는 이야기군요.. 하지만 저에게는 IDA가 있죠! IDA로 HateIntel 파일을 분석해보겠습니다. main 함수 부분입니다. sub_232C 함수 부분입니다. sub_2494 함수 부분입니다. 핵심 함수는 위 3개이고 처음에 입력을 받고 암호화하는 과정을 역연산해서 byte_3004[i] ..
Reversing.kr의 문제 Position입니다. 문제 파일을 다운로드 받아보면 Position.exe와 ReadMe.txt 파일이 있습니다. ReadMe.txt 파일을 열어보면, Serial이 76876-77776 일 때에 패스워드를 찾으라네요. 그리고 패스워드는 4글자이고, p로 끝난답니다. Position.exe를 실행시켜보겠습니다. Name을 입력받는 부분과 Serial을 입력받는 부분이 있습니다. 그리고 그 밑에 성공인지 실패인지 알려주네요. 이제 IDA로 분석을 해보겠습니다. sub_401740 함수의 리턴값이 1일 때 성공 문자열을 출력하네요. sub_401740 함수를 분석해보겠습니다. Name의 길이가 4글자여야 하고 소문자 알파벳으로 이루어져 있어야 하네요. Name에 중복문자가 있..
- Total
- Today
- Yesterday
- Level 05
- Level 06
- 풀이
- 17th HackingCamp CTF
- C#
- 유니티
- Programming
- 안드로이드
- pwnable
- Android
- c++
- 안드로이드 멘토링
- Level 03
- Write-up
- Level 01
- reversing.kr
- 멘토링
- Level 04
- unity2d
- Basic RCE
- xcz.kr
- Advance RCE
- ftz
- HackingCamp
- wargame
- Reversing
- CodeEngn
- hackerschool
- Level 02
- Unity
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |