OEP를 찾으시오. / Stolenbyte 를 찾으시오.정답인증은 OEP + Stolenbyte 라고 한다. 실행시켜보자 프로그램 실행화면 어디서 많이 봤다. 그래도 혹시 모르니 언패킹 후 빠르게 찾아주자. 그냥 똑같다. https://imoracle.tistory.com/entry/Reversing-CodeEngn-Basic-RCE-L09 [Reversing] CodeEngn - Basic RCE L09StolenByte를 구하시오 라고 한다. StolenByte가 뭐냐고? 본인이 간단한 안티치트툴을 만들어보며 작성했던 pdf 파일에서 발췌해 왔다. 조금 더 덧붙이자면 안티 디버깅 기법중 하나이며, 단어의imoracle.tistory.com여기서 풀이한 프로그램과 똑같으며, OEP와 StolenByt..
OEP를 구한 후 "등록성공" 으로 가는 분기점의 OPCODE를 구하시오.정답인증은 OEP + OPCODE 라고한다. 프로그램 실행모습이번 회차에선 프로그램 실행모습은 크게 의미가 없다 패킹을 확인하자 ASPack 으로 패킹되어 있다.ASPack : UPX와 유사하지만 선호도가 낮다언패킹 : PUSHAD -> 압축해제 코드 -> POPAD -> RETN 으로 동작한다. UPX는 POPAD 이후 나오는 JMP 인스트럭션을 통해 OEP로 분기한것과 살짝 다르다 F9로 실행하니 PUSHAD 로 도착했다.밑으로 내리다보면 POPAD를 만나게 된다.POPAD 를 찾았고, 밑에 PUSH 0 과 RET에 브레이크포인트를 걸고 살펴보자PUSH 0 이었던 부분이 PUSH 445834 로 바뀌었다. 445834가 OE..
StolenByte를 구하시오 라고 한다. StolenByte가 뭐냐고? 본인이 간단한 안티치트툴을 만들어보며 작성했던 pdf 파일에서 발췌해 왔다. 조금 더 덧붙이자면 안티 디버깅 기법중 하나이며, 단어의 의미처럼 코드를 훔쳐 다른 곳으로 옮긴 것이다. OEP 주소의 코드를 분리해 점프 직전 Push로 넘겨준다. 프로그램 실행모습 언패킹 해주자 다시 실행하자메세지박스가 깨져서 나온다.UPX는 제일 위 사진의 설명처럼 upx0, upx1로 나뉘어 있다. Peview를 통해 보게되면SECTION UPX0 : 섹션 및 기타 초기화 코드 -> 압축코드가 해제될 곳SECTION UPX1 : 복호화 알고리즘 -> 압축코드가 저장된 곳 IDA로 보자12바이트만큼 NOP처리가 되어있다. 저 곳에 StolenBy..
OEP를 구하시오 라고 한다. 구해보자. Upx Unpacking 우선 언패킹 해주었다. 프로그램 실행 화면그냥 단순한 계산기 프로그램이다. 언패킹을 한 순간부터 OEP는 이미 구했다. 이전 Basic RCE L06 풀이에서 설명했다시피 https://imoracle.tistory.com/entry/Reversing-CodeEngn-Basic-RCE-L06 [Reversing] CodeEngn - Basic RCE L06Unpack을 한 후 Serial을 찾으시오. 정답인증은 OEP + Serial 이라고 되어 있다. Serial만 찾으면 되지만 OEP도 찾아보자 OEP ( Original Entry Point ): 패킹된 파일의 시작 부분을 의미한다. OEP 이전 실행 부분은imoracle.tistor..
컴퓨터 C 드라이브의 이름이 CodeEngn 일경우 시리얼이 생성될 때 CodeEngn은 '어떤것'으로 변경되는가라고 물어온다. 시리얼이 생성될 때 어떠한 과정을 거쳐 기존의 문자열이 다른 것으로 변경된다는 말이지 않을까? 프로그램 실행화면 IDA로 열어보자 GetVolumeInformationA 함수를 호출한다.지정된 루트 디렉터리와 연결된 파일 시스템 및 볼륨 관련 정보를 검색합니다 라고 msdn에서 설명하고 있다. lpVolumeNameBuffer 가 보이는데 지정된 볼륨의 이름을 받는 버퍼에 대한 포인터입니다. 버퍼 크기는 nVolumeNameSize 매개 변수로 지정됩니다.라고 msdn에서 알려준다. C드라이브의 이름이 CodeEngn 일 경우라고 했으니 저 인자가 저장된 곳에 드라이브 이름이 ..
Unpack을 한 후 Serial을 찾으시오. 정답인증은 OEP + Serial 이라고 되어 있다. Serial만 찾으면 되지만 OEP도 찾아보자 OEP ( Original Entry Point ): 패킹된 파일의 시작 부분을 의미한다. OEP 이전 실행 부분은 패킹된 파일이 메모리에로드되어 압축을 푸는 명령어가 들어있다. EP ( Entry Point ) : 프로그램이 실행될 때 시작되는 지점을 가리킨다. 대부분의 프로그래밍 언어에서는 "main()" 함수가 이 역할을 수행한다. OEP는 언패킹한 프로그램의 EP와 같다. ImageBase 인 00400000 + 00001360 [ ep ] 를 해주면 00401360 으로 oep를 구했다. 프로그램 실행모습 UPX Packing이 되어있다. 언패킹 ..
이 프로그램의 등록키는 무엇인가 라고 묻고있다. 프로그램 실행화면텍스트박스가 2개인걸 봐선 전부 맞는 값이어야 통과가 되지 않을까 예상해본다. IDA로 열어보자열자마자 UPX라는 단어가 보인다. 분석을 어렵게 하기위해 Packing을 하는데 그 중 하나인 UPX Packing으로 패킹된거 같다.PEID로 다시 확인해보자.UPX 로 패킹된걸 확인했다. UPX는 언패커가 나와있기 때문에 손쉽게 언패킹이 가능하다. 언패킹을 해주자언패킹이 완료 되었다.다시 IDA로 돌아가면 기존엔 함수부분에 Start만 떴지만, 많이 뜨는 걸 볼 수 있다.string 검색을 해주자Wrong Serial try, again! 부분을 찾았다 따라가보자Registered_User.Text = "Registered User" 인 걸 ..
이 프로그램은 디버거 프로그램을 탐지하는 기능을 갖고 있다. 디버거를 탐지하는 함수의 이름은 무엇인가?라고 묻고있다. 안티디버깅 테크닉이 쓰였단 말이며, 본인은 간단한 안티치트툴을 제작해 본 적이 있기 때문에어떤 함수가 쓰일지 대충 알고 있지만 차근차근 찾아보도록 하자 프로그램 실행모습"정상"이라는 텍스트를 출력해주다 디버깅을 감지하면 "디버깅 당함"을 출력해주고 있다. IDA로 열어보자그냥 바로 보인다. 역시 예상대로 IsDebuggerPresent를 사용하고있다.이녀석이 무엇이냐 하면... peb의 beingdebugged 의 값을 리턴하는데 디버깅중이라면 1 아니라면 0을 리턴한다.peb의 주소는 teb에서 얻을 수 있다. 이 부분은 나중에 따로 글을 쓰도록 하자. 브레이크포인트를 걸고 실행시켜보면..
Basic RCE l02 문제는 현재환경에서 열리지 않아서 건너뛰었다. L03 문제의 설명에는 비주얼베이직에서 스트링 비교함수 이름은? 이라고 묻고있다. 설명해주지 않았어도 프로그램 실행시에 msvbvm50.dll 이 없다면서 앙탈부리는걸 보면누가봐도 vb로 만들어졌다는 걸 알 수 있다. 실행시켜 보자 영어같은영어아닌 너뭐라는지 모르겠다. 확인눌러보자 대충 코드가 맞아야 성공메시지가 뜨겠구나를 알 수 있다. vb의 경우 메시지 박스도 rtcMsgBox를 사용하고 좀 다른 함수명을 가지고 있다. 사실 옛날 vb6.0을 정말 재밌게 가지고 놀았던 기억이 있기에 무슨 함수를 사용하는지 알고있다.vbaStrCmp 를 사용하리라 짐작한다.치트엔진에서 바로 함수부분으로 갔지만 차근차근 찾아보자 치트엔진, ID..
CodeEngn [코드엔진] 사이트에서 초급단계로 분류되어 있는 문제다.HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는지를 묻고있다. 우선 프로그램을 실행시켜보자. 프로그램 실행 모습 메세지박스 두개로 이루어져 있는 모습을 볼 수 있다.CD-ROM이 아니라고 호소한다. 메모리를 보기 위해 다양한 디버거들이 존재 하지만, CheatEngine [치트엔진]을 사용해 크랙을 해보자 DarkByte 형님 생일이시군요 ? 치트엔진을 켰더니 제작자인 DarkByte 의 생일이라고 한다. (사진 캡쳐당시 7월 1일) happy birthday darkbyte ! 뜯어볼까 GetDriveTypeA 함수를 볼 수 있으며, 밑의 cmp eax, esi 를 통해 비교..
https://www.acmicpc.net/problem/9506 9506번: 약수들의 합 어떤 숫자 n이 자신을 제외한 모든 약수들의 합과 같으면, 그 수를 완전수라고 한다. 예를 들어 6은 6 = 1 + 2 + 3 으로 완전수이다. n이 완전수인지 아닌지 판단해주는 프로그램을 작성하라. www.acmicpc.net #include #include #include #include #include #include #include #include #include #include using namespace std; void fastIO(); int main() { int n; vector vec; while (true) { cin >> n; if (n == -1) break; for (auto i = 1;..
https://www.acmicpc.net/problem/2581 2581번: 소수 M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다. 단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다. www.acmicpc.net #include #include #include #include #include #include #include #include #include #include using namespace std; void fastIO(); int main() { int M, N = 0; int cnt = 0; vector vec; cin >> M; cin >> N; for (auto i = M; i