본문 바로가기

WarGAME/CodeEngn

(7)
codeengn basic L07 문제를 실행해보면 serial을 넣으라고 한다. 이름을 입력하는 란이 없으니 디버거로 열어보자. 디버거로 열자마자 프로그램 메인 동작에 해당하는 코드들이 나와서 바로 분석을 시작했다. 옳은 시리얼이라는 문자열을 출력해주는 분 serial입력란에 SERIAL이라 적어주고 명령어 하나씩 실행해보았다. 입력해준 문자열 SERIAL과 CMP하는 문자열이 시리얼일거라 생각이 들지만... NAME을 지정해준 적이 없는데 특정 NAME에 해당하는 시리얼을 알아내라고 했으니 C드라이브의 이름에 해당하는 부분을 바꿔줘보자. C드라이브의 이름이라고 했으니.. GetVolumeInformationA함수가 가장 의심스러웠다. 해당 함수에 파라미터로 넣는 값 중 c드라이브의 이름을 입력하는 부분을 바꿔줘봐야겠다. 파라미터 이름..
codeengn Basic RCE L17 1. cocodeengn Basic RCE L17 키값을 주고 Name을 구하라는 걸 보니 Name에 따라 키값이 정해지는 문제인가 보다. Name에 해당하는 Key값을 넣고 Check it!을 클릭해서 맞으면 맞다고 해주는 프로그램일 거라고 예상했는데 아무런 반응이 없었다. 그래서 Name에만 값을 입력하고 Key 값은 비워둔 상태로 Check it!을 눌렀더니 프로그램이 어떻게 동작하는 지 대충 알 수 있었다. 1) 2개 이내의 문자열 입력할 경우 >> 문자열을 더 입력하라고 한다 2) 3개~30개의 문자열 입력할 경우 >> Key 값에 아무런 값도 출력되지 않는다 3) 31개 이상의 문자열 입력할 경우 >> 30개보다 많은 문자 입력하지 말라고 한다. ==> 결론적으로 Key값을 전혀 출력할 생각이..
codeengn basic 15 디버거로 열어보자. 문자열을 찾아서 시리얼을 비교하는 부분을 찾아보자. 진입함. 첫번째 함수를 실행하니 EDX에 name으로 정해준 "CodeEngn"이 저장된 주소값이 저장되었다. 세번째 함수 실행 전에는 시리얼 값으로 입력해 주었던 문자열의 주소가 EAX에 저장되었다. 드디어 시리얼이 옳은지 확인하려나보다.(아마 직전_두번째 함수에서_에 시리얼 생성했을듯) 세번째 함수 다음에 성공과 실패 문자열 출력을 가르는 분기문이 있었으므로 세번째 함수에 name인 CodeEngn에 해당하는 원래 시리얼과, 임의로 입력해준 시리얼값("moyaserial")을 비교하는 과정이 있을 것이라 예상되었다. 따라서 세번째 함수에 진입했다. 아래는 세번째 함수의 코드인데, 함수 내부에 또다른 함수들이 많아 조금 헷갈리지만 ..
codeengn Basic L04 | codeengn Basic L09 1. codeengn Basic L04 프로그램 강제 종료할 때까지 계속 실행했다 디버거로 열고 실행하니 아까와는 달리 '디버깅 당함'이라는 글자가 계속 출력됨. IsDebuggerPresent 함수에 bp를 걸어주고, 그 뒤의 JE 분기문과 그 분기문에서 jump하는 지점인 0040107E에 BP를 걸어주었다. 처음에 IsDebugger 함수에 진입하니 retn지점이보였는데 중간에 jump해서 다른 곳으로 이동했다. IsDebuggerPresent 함수 내부 코드 분석은 일단 보류. 쭉 실행해보니 리턴할 때 EAX 레지스터엔 1 저장되어있었다. 그러고 나니까 디버깅 당함 문자열이 출력됐다. 원래 정상이라고 출력시켰던 건, JE분기점에서 JUMP해서 "디버깅 당함" 문자열 저장된 메모리를 참고하는 곳으로..
codeengn Basic RCE L02 주어진 실행파일이 손상되어 실행이 안되지만 패스워드를 분석하라고 한다. 그래도 실행을 시도해봤지만 당연히 실패했다. 디버거로 열어봤지만 역시 해당 파일은 열 수 없다는 창이 뜨며 내부 코드도 확인할 수 없었다. 동적분석은 안되는 것 같으니 정적분석 도구를 이용해보기로 했다. HxD로 열어보니 성공문자열 뒤에 패스워드일 것 같은 문자열이 있었다. IDA pro 로도 열어봤는데, 성공 문자열 뒤의 내용이 패스워드인 것 같았으나 앞에서 발견한 문자열이 전부 나오지 않고 뒤의 2개의 문자가 짤려서 확인 됐다. IDA pro 로도 Hex코드를 확인하니 제대로 보였다. 인증해보니 헥사코드에서 확인할 수 있었던 문자열이 패스워드가 맞았다.
codeengn Basic RCE L06 Unpack이 뭘 의미하는지는 모르겠으나 일단 주어진 문제 파일을 실행해봤다. Serial을 입력하고 체크버튼을 누르면 올바른 시리얼인지 확인해주는 프로그램이었다. 일단 시리얼을 모르는 상태에서 프로그램 실행으로 할 수 있는 게 없으니 디버거로 열어보기로 했다. Immunity Debugger로 열어 보니 처음에 PUSHAD라는 명령어가 있었다. 처음 본 명령어라 검색을 해보니 Push All을 의미하는 것으로 레지스터 백업 용도로 사용한다고 했다. 즉, 정해진 순서대로 레지스터의 값들을 스택에 push한다는 것이었다. (POPAD는 반대로 PUSHAD명령어가 스택에 저장해둔 레지스터의 값들을 원래의 레지스터에 되돌려줄 때 사용한다고 한다) 실행해보니 정말 레지스터의 값들(8개)이 스택에 push되었다...
패킹 / 언패킹 패킹 실행압축. 사전적 의미대로 포장을 의미하는데, 구체적으로는 프로그램의 압축과 보호 역할을 한다고 볼 수 있다. 실행파일(PE파일)의 용량을 작게 만들고, 내부코드 및 리소스의 분석을 막아준다. 압축(zip, rar)한 파일은 압축을 풀어야 실행시킬 수 있어 바로 압축했음을 알 수 있지만, 패킹한 파일은 패킹하지 않은 프로그램과 동일하게 실행할 수 있기 때문에(그래서 실행 압축) 실행만으로 패킹여부를 알 수는 없다. 패킹한 파일 형태도 원본파일과 동일하게 PE구조를 갖는다. (패킹한 파일에 패킹을 푸는 소스_디코딩 소스_가 포함되어있기 때문에 프로그램 실행 시 메모리에서 압축을 푸는과정을 거쳐 프로그램이 실행된다. 따라서 패킹파일은 패킹 전에 비해 실행시간이 느려지긴 한다고 한다.) +압축 파일은 확..