목록전체 글 (346)
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이 나온다.
임의의 비번을 입력했다. 해당 문자열을 찾아주었다. 분기문에서 성공루틴으로 갈린다. strcmp로 문자를 비교한다. 06162370056B6AC0을 비교해준다. 이대로 비번을 입력하면 키젠을 풀수있다.
Name이 한자리라 했는데 프로그램에 입력하면 문자열 길이가 모자르다고 나온다. 해당 문자열의 위치를 찾았다. 문자열의 길이를 체크하는 조건문을 패치해주기로 한다. 길이를 1로 만들었다. 그 후 성공루틴으로 가는 분기문을 찾았다. 해당 함수에서 Name에 따른 key값이 생성되는것을 알수있었다. 암호 생성 루틴인데 Name 한자리이기 때문에 해당 부분만 분석을 진행하면된다. Name을 A로 입력할시 생성되는 키값은 0x0051bffe374f0이다. 여기서 ffe3값을 문자열로 변환해 키값의 앞자리가 되는 방식이다. 파이썬으로 코드를 짜서 Name값을 찾기로 했다. beda가 속한 키값이 존재한다. Name은 0x46으로 F이다.
c++로 작성된 프로그램이다. 콘솔형 프로그램이다. 정답 루틴으로 갈리는 분기문을 찾았다. [EBP-3C]에는 0xE4C60D97 이라는 값이 있다. 이를 EAX와 같게 만들어주어야 한다. EAX에는 무슨 값이 들어가나 확인을 했다. 4321을 입력했을 때 0x10E1이 들어있었다. 0x10E1을 십진수로 바꾸면 4321이 그대로 나온다. 즉 0xE4C60D97을 십진수로 바꾸어 입력하면 정답이다.
L14번과 비슷한 문제이다. 아이디 패스워드를 맞추는 프로그램이다. 델파이로 작성된 프로그램이다. 먼저 분기문을 찾아주었다. EAX와 0x45B844의 데이터를 비교한다. 0x45B844에는 0x6160의 데이터가 들어가있다. 0x407774에 비밀번호를 설정하는 루틴이 존재하는것을 알 수 있다. ret값을 0x6160으로 만들어주면 된다. 비밀번호를 설정하는 핵심 코드이다. 해당 부분을 파이썬 코드로 만들어 브루트포싱으로 비밀번호를 찾아준다. for b in range(0,10): for i in range(0,10): for j in range(0,10): for k in range(0,10): for m in range(0,10): temp = b temp = temp + temp * 4 temp ..
아이디를 준지 모르고 풀었다. 아이디와 비번을 입력하는 간단한 프로그램이다. UPX를 수통 언패킹 해주었다. PUSHAD를 찾고 ESP 트릭을 해준다. 하드웨어 BP를 걸어준다. OEP 진입 후 DUMP뜨고 IAT설정을 해준다. 이후 DUMP파일을 다시 올려준다. Run to user code로 문자열을 찾아주었다. 비번은 해당 함수의 리턴값과 esi값을 비교한다. esi는 CodeEngn입력시 0x129a1 고정이다. 그런 비번을 작업하는 함수가 어떤 루틴이 있는지 보았다. 12345입력시 1 * 0xA^4 + 2 * 0xA^3 + 3 * 0xA^2 + 4 * 0XA + 5 의 연산작업을 걸친다. 이값이 0x129a1과 같아야 한다. 브루트 포싱으로 답을 찾기로 했다. 비번이 76193이 나왔다.
서비스 보면 여러 이름들이 있는데 등록된 서비스를 실행시켜준다. services.msc로 등록된 서비스들을 확인할 수 있다. svchost.exe에 등록되어있는 서비스 중 하나를 확인했다. 실행 파일 경로는 svchost.exe -k netsvcs를 실행한다. 올리디버거로 과정을 파악한다. oep로 bp를 걸고 이동해준다. resource 관련 루틴으로 가기 위해 403a2c로 이동해주었다. bp를 걸어준다. 함수 내부로 진입해준다. 문자열을 합치는 작업을 하고 있다. 분기문이 나오는데 eax값의 따라 분기문이 나뉜다. 이는 403100함수의 반환 값이다. 해당 함수는 reg 관련된 함수들이 나오며 netsvcs가 가능하면 64to32를 세팅하는 듯하다. 이게 되냐 안 되냐에 따라 달라지는 것 같다. 해..