보안(5)
-
# 코드 엔진 문제: basic 5
언패킹 되어 있으므로 먼저 언패킹을 풀어준다. 프로그램을 실행해본다 (문제 파악) 디버깅하면서 프로그램이 어떤 경로에서 프로그램이 실행되는지 따라가본다 (어디서 CALL하는가) 스트링을 검색한다. (처음에 실행(F9)하면 0x4xxxxx로 진입하게 되는데 여기에서 검색해야한다) 함수를 검색한다. 스트링을 검색한 후 스트링을 살펴보면 문제의 답으로 추정되는 계정과 시리얼을 찾을 수 있다. 그 근처에 몇개의 브레이크 포인트를 걸고 다른 계정과 시리얼을 입력하며 어디에서 멈추는지 찾아본다. 계속 이동시켜보며 함수가 어떻게 동작하는지 살펴보면서 계정과 시리얼이 맞을때는 어떻게 이동하는지 틀릴때는 어떻게 이동하는지 확인하고 성공 구문을 출력하기전에 다른 곳으로 이동시키는 점프문 같은 것들이 어떻게 이동하는지 살펴..
2021.01.29 -
# 코드 엔진 문제: advance 3
답은 문자열 근처에 브레이크 포인트를 걸고, 걸리는 곳 주변을 확인해보면 쉽게 찾을 수 있다. 어느 함수가 실행된 후 시리얼이 생성되는지 확인 후 해당 함수로 들어가 보니 특정 문자열을 이리저리 변환하고 있다. 문자열 길이만큼 다 변환한 후에 그 값을 더하고 특정 연산을 하는 것으로 추정된다. 61 - 입력값 abcd의 첫번째 숫자 아스키값 EBX 61 5) 1EE2BACB add 5DD6 = 1EE318A1 mov EBX, 11 mov ECX, EAX (EAX를 ECX에 넣고) CDQ IDIV EBX = EAX가 11로 나눠짐 XCHG EAX(01D11F91), ECX(1EE318A1) = 서로 값 교환 ADC EAX,2 = EAX값이 3 증가 (1EE318A4) 위의 과정을 계속 문자열 길이까지 계속..
2021.01.29 -
# 코드 엔진 문제 : Basic 1
문자열 검색을 이용해 프로그램 창의 문자열 위치까지 도달할 수 있고, 해당 문자열이 보여지는 주소를 더블클릭하면, 해당 위치로 이동할 수 있다. 1. 디버거로 프로그램을 열어 끝까지 실행 2. 텍스트 참조 3. In the bin 문자열 찾기 4. 해당 문자열이 있는 곳에 브레이크 포인트를 걸고 이동 5. 비교 문이 있는 곳에 브레이크 포인트 설정 6. 비교 문에서 분기하기 때문에, 적절하게 값을 바꿔준다
2021.01.29 -
# 코드 엔진 문제 : Basic 8
패킹을 확인해보았으나, 패킹은 되어있지 않았다. 시작하자마자 바로 OEP부터 시작하는 것으로 보인다. 문제에서는 문자의 길이는 두자리라고 하였으므로 문자를 2자리로 입력하고, 출력되는 문자열 근처에 브레이크 포인트를 걸고 실행해본다. 쭉 따라가다보니 CMP 명령이 보이고 EAX,3 비교와 EAX, 1E 비교가 보인다. 그 전에 EAX에는 이미 입력한 문자열 길이인 숫자 2가 들어가 있는 것으로보아 문자열을 검증하여, 길이가 짧을 경우 경고문을 출력하게끔 되어있는거 같다. 어셈블리를 수정하여 CMP EAX,2로 바꿔준다. 쭉 진행하다보면 의심스러운 동작을 하는 주소를 발견할 수 있는데 0045BB9B 로 들어가서 코드를 보다보면 특정 시리얼을 만들어내는 것으로 추정되는 반복문들을 볼 수 있다. 아래는 그 ..
2021.01.29 -
# 코드 엔진 문제 : Basic 15
먼저 디버거를 이용해 열어보니 패킹은 되어있지 않은 것을 확인할 수 있다. 문자열 검색을 통해 목적 구문을 확인할 수 있으며, 더블 클릭하여 해당 경로로 이동한다. 주변에 다수의 브레이크 포인트를 설정한 후 실행(F9)시키고, 문제에 맞게 CodeEngn의 키 값을 찾기위해 name에 CodeEngn을 입력하고, Serial에는 임의의 값을 입력 후 Check it!을 눌러본다. 문자열의 입력을 받아야하는 곳에 지정된 브레이크 포인트에서 동작이 멈추었다. 이제 조금씩 따라가본다. 따라가다보니 CMP 두 조건을 비교하는 비교문을 확인할 수 있으며, 그 비교 결과에 따라 제로플래그를 생성하여 CRACKED를 출력하거나 Try Again을 출력하는 것으로 판단된다. 그런데 자세히보니 EAX 레지스터에 3039..
2021.01.29