목록wargame (207)
문제가 너무 힘들었다. 남은 군생활의 일수가 점점 늘어난다. upx로 패킹이 되어있다. 언패킹 해준다. 안티디버깅을 우회해 준다. bp를 걸고 MessageBoxW함수에 도착했다. ebp에 일수가 쌓인다. ebp와 어떤 값을 비교하는지 찾아주어야 한다. 모든 조건문을 탐색했다. eax에 우리가 원하는 값이 담겨있다. 답 : 2DACE78F80BC92E6D7493423D729448E 다른 사람들의 풀이를 보면 패치하고 덤프를 만들어서 Exe2Aut 프로그램을 사용했다. 자동으로 버튼을 넘길 수 있었다.
패킹이 되어있지 않다 바로 디버거에 올린다. 문자열을 검색해서 의심가는 부분을 분석했다. 문자열 비교 함수를 찾았다. 내가 입력한 값과 비교값을 인자로 넣는다.
이번에도 키젠문제 확인할만한 데이터는 없었다. 네임과 시리얼을 입력하고 확인한다. 코드가 암호화되어있었다. xor al,25를 통해 다시 복호화하는 과정이다. 복호화가 끝나고 이동한 후의 위치가 OEP이다. 문자열을 통해 검색하면 분기문이 보인다. 이번에도 strcmp를 통해 비교를 한다. 0x403104의 문자열을 입력해 준다.
패킹이 되어있지 않다. 간단한 키젠 프로그램이다. 12345678을 입력했다. strcmp의 인자값으로 비교값 두 개가 들어가는 것을 확인했다. 같은 값을 입력해주었다.
아이콘부터 섬뜩하다. 프로그램이 실행되자마자 꺼진다. 해당 부분에서 계속 예외발생이 된다. 멈춰가는 부분을 추적해서 계속 info 해주고 분기문을 찾는다. 의심 가는 분기문을 찾았다. flag를 바꾸어 탈출해 준다. 실행이 안되던 프로그램에 문자열이 출력된다. 패스워드를 아무거나 입력해서 비교 구문을 찾아준다. 비밀번호는 CRAAACKED! 이다.
저번에 풀었던 문제와 동일하다. 프로그램 실행 시 팝업창이 나오고 종료된다. UPX로 패킹이 되어있다. 언패킹을 해주었다. 안티디버깅에 걸린다. 해당 참조 부분에서 리턴값을 0으로 바꾸어준다. 의심함수 중 timeGetTime을 분석했다. 모두 call을 하지만 한 부분에서만 edi에 옮긴다. 이는 나중에 시간 관련 로직에서 사용하기 위해 레지스터로 옮긴 모습이다. ebx+4의 참조 부분을 찾는다. 0x337b를 10진수로 바꾼 후 md5의 해시값을 구해주면 끝이다.
Basic의 마지막 문제다. 프로그램 실행시 창하나가 뜨고 베너창에 Uncrack이라 적혀있다. 이것을 crack문구로 나오게끔 key파일을 만들어주어야 한다. 처음 프로그램 실행시 CRACKME3.KEY 파일이 필요한것으로 추측했다. 파일을 만들고 임의의 값을 넣어주었다. 다음은 KEY의 길이를 비교한다. 0x12만큼 맞춰주어야 한다. 길이를 맞추어주고 다시 디버깅을 한다. 두개의 중요함수가 있다. 0x401311과 0x40133c이다. 해당 함수에서 많은 분석을 했지만 의미가 없었다. 입력한 문자에서 14글자를 한글자씩 가져와 여러 연산을 거치지만 cmp al, 0 에서 바로 종료 루틴으로 가기에 첫 글자를 0x41로 맞추어 종료루틴으로 간다. 그후 0x12345678을 진행하지만 어자피 값이 0이기..
UPX패킹이 되어있다. 프로그램을 이용해서 언패킹을 진행했다. 디버깅을 진행할려하면 에러가 발생한다. 안티디버깅이 걸려있다고 생각했다. IsDebuggerPresent가 걸려있다. IsDebuggerPresent는 디버거가 실행중인지 확인하여 실행중이면 1 아니면 0을 eax넣고 반환한다. 즉 eax에 0을 넣고 ret하면 디버깅을 진행할 수 있다. 코드를 수정해주고 분석을 진행한다. 빠른 분석을 위해 IDA를 활용했다. 의심가는 함수중 timeGetTime의 참조영역을 찾기로 했다. StartAddress 근처를 탐색했다. 의심이 가는 루틴을 찾았다. 어떠한 값을 비교한 후 sleep으로 가거나 종료 루틴으로 간다. 2B70이라는 값을 10진수로 바꾸면 11120이 나온다.