목록Reversing/CodeEngn (32)
Information Security Study

문제: 이 프로그램은 몇 밀리세컨드 후에 종료 되는가 정답인증은 MD5 해쉬값(대문자) 변환 후 인증하시오 문제 파일을 실행했을 때의 모습이다. PEiD로 확인하니 UPX로 패킹되었음을 확인할 수 있었다. CFF로 언패킹했다. 언패킹한 뒤 Immunity Debugger로 열어주었다. 이처럼 Autoit script가 뜨는 거로 보아 안티 디버깅이 걸려있는 것 같다. IsDebuggerPresent 함수를 찾아볼 것이다. 하나씩 내려가 보면 결국에 바로 밑인 40E967에서 TEST EAX, EAX 로인해서 JNZ에서 분기를 하게 되어 4338DE로 가게되고 해당 주소에서 위의 메시지 박스가 생성된다. 그래서 40E967주소에 있는 TEST EAX, EAX를 CMP EAX, EAX로 변경을 해서 분기를 ..

문제: 이 프로그램은 몇 밀리세컨드 후에 종료 되는가 파일을 실행했을 때의 모습이다. 몇 초뒤에 종료된다. 언패킹되어있다. CFF로 언패킹해주었다. 우클릭>search for>all intermodular calls를 선택해서 모든 명령들을 확인했다. F9를 눌러보면 제대로 실행이 되지 않는데 함수 목록을 살펴보면 IsDebuggerPresent 함수를 확인할 수 있고, 이 함수 때문에 디버깅이 제대로 되지 않는 것을 확인할 수 있다. IsDebuggerPresent 함수를 찾았다. 안으로 들어가봤다. TEST EAX, EAX를 CMP EAX, EAX로 고쳐서 IsDebuggerPresent 함수가 제대로 동작하지 못하도록 했다. 디버깅이 이제 제대로 되므로 프로그램의 실행 시간과 관련 있는 함수들을 탐..

문제: Name이 CodeEngn일때 Serial은 무엇인가 문제를 실행한 뒤 Serial에 아무 값이나 입력했다. 임의의 값을 넣었을 때 확인한 실패 문자열을 보고 해당 코드 안으로 들어가 보았다. 분기점에 BP를 걸고 실행했다. Serial에 abcd를 입력했다. 입력한 뒤 코드를 보니 내가 입력한 Serial과 .6162370056B6AC0을 비교하는 것 같았다. 6162370056B6AC0을 Serial 값으로 입력하니 성공 문자열을 볼 수 있었다.

문제: Key 값이 BEDA-2F56-BC4F4368-8A71-870B 일때 Name은 무엇인가 힌트 : Name은 한자리인데.. 알파벳일수도 있고 숫자일수도 있고.. 정답인증은 Name의 MD5 해쉬값(대문자) 문제를 실행했을 때의 화면이다. 정답은 한 자리라고 했는데 문자를 더 입력하라고 뜨는 걸 보니 코드 수정이 필요할 것 같다. 방금 확인한 문자열을 찾아 들어가보았다. 문자열이 3자리 이상인지 확인하는 코드인 것 같다. 정답이 한 자리이니 1로 수정했다. Name에 1을 입력해도 더이상 문자를 추가하라고 뜨지 않았다. 45BBA9에서 JNZ를 통해 분기를 하고 있다. 맨 위의 MOV문은 EDX에 EBP-14의 값을 옮기고 있다. 이 부분은 아마 Key 값을 EDX에 넣기 위함인 것 같다. 그러므로..

문제: OEP를 구한 후 '등록성공' 으로 가는 분기점의 OPCODE를 구하시오. 정답인증은 OEP + OPCODE EX) 00400000EB03 문제 파일을 실행했을 때의 모습이다. Immunity Debugger로 열어보니 패킹되어있었다. PUSHAD를 실행한 뒤 ESP에 Follow in Dump를 한 후 ESP가 가리키는 메모리 주소에 접근할 때 Break Point를 걸어두고 실행했다. BreakPoint가 걸린 부분을 살펴보면, JNZ 구문에 의해 분기가 일어나며 PUSH 명령을 통해 00445834(OEP) 주소를 스택에 저장한 이후 RETN 명령을 통해, 00445834로 점프하는 것을 알 수 있다. OEP로 이동했다. 이제 등록성공 분기점 opcode를 찾을 것이다. 성공 문자열을 찾았다..

문제: StolenByte를 구하시오 Ex) 75156A0068352040 문제 파일을 실행했을 때의 모습이다. UPX로 패킹되어있었다. 언팩한 파일과 패킹된 파일을 실행했을 때의 모습은 같아야 하지만 다르게 나타났다. 패킹된 파일을 열어보니 NOP으로 덮인 부분이 있었다. 우선 PUSHAD 한 줄을 실행한 후 ESP에 Follow in Dump를 해주었다. 그 후 첫 주소에 BP를 걸어주었다. BP를 걸어준 후 f9로 실행하니 OEP로 이동하는 JMP문을 발견했다. JMP에서 우클릭 > Follow로 OEP로 이동했다. Ctrl + e 로 StolenByte의 OP 코드를 넣어주었다. OEP 찾는 방법 https://honorlog.tistory.com/5 [CodeEngn] Basic RCE L05 ..

문제: OEP를 구하시오 Ex) 00400000 문제를 실행했을 때의 모습이다. 패킹되어있었다. 01020C40에서 F8을 누르니 01020C41로 이동하면서 PUSHAD 가 실행 되면서 ESP 값이 바뀐 것을 알수 있었다. ESP에 Follow in Dump를 눌러 Hex Dump 부분으로 이동했다. 첫 주소에 BP를 걸었다. BP를 건 뒤 f9로 이동하니 01020DBE로 이동했다. 밑에 JMP 해서 도착하는 01012475가 OEP다.

문제: Name이 CodeEngn일때 Serial을 구하시오 문제 파일을 실행했을 때의 모습이다. Serial 값을 임의의 숫자로 입력했다. 성공 구문을 찾아 들어가보았다. 성공 구문 근처의 CMP문을 찾아 BP를 걸어 실행했다. EAX와 어떤 값을 비교하는 것 같다. Password로 1을 입력했다. EAX에 Password가 들어가는 것을 알 수 있었다. CMP문에서 우클릭 > Follow in Dump > Memory address로 Hex dump를 확인했다. 메모리 주소를 따라가서 16진수 값을 확인했다. 0xE4C60D97을 10진수로 변환하면 3838184855이다. 문제 파일을 다시 실행해 입력해보니 성공 문자열을 볼 수 있었다.