CodeEngn Basic RCE L15 문제 확인 L14 문제와 동일하게 Name이 CodeEngn일 때 시리얼 값을 구하는 문제인데 이번 풀이는 상당히 짧다. 파일을 실행시켜 보니, 아래와 같이 Name과 Serial 값을 받고 있다. CodeEngn Basic RCE L15 풀이 PEID로 간단히 확인해보니 패킹되어 있는 것은 없고 델파이 프로그램이다. 델파이 분석 툴이 필요할까 했는데 없어도 풀이는 충분히 가능했다. 먼저 문자열 값 중에 시리얼 체크 분기와 관련있어 보이는 문자열인 'You cracked the ~'을 찾은 후 해당 문자열이 쓰이는 함수로 가 시리얼 체크 분기문을 찾을 수 있었다. 분기 조건이 eax와 dword_45B844가 같은지 이므로 해당 부분에 bp를 걸고 eax와 45B..
CodeEngn Basic RCE L14 문제 확인 Name이 CodeEngn일 때의 시리얼 값을 구하는 문제인 것을 보니 Name에 따라서 시리얼 값이 달라지는 모양이다. 파일을 실행시켜보니 아래와 같이 두개의 입력값을 받게 되어있고 첫번째 입력값이 Name인 것으로 추정된다. 참고로 해당 파일은 UPX 패킹이 되어있기 때문에 언팩을 해주어야 한다. CodeEngn 문제 파일 중에 UPX로 패킹되어있던 파일이 많아 여러번 언팩을 했으므로 언팩과 관련해서는 아래의 포스팅 등을 참고하길 바란다. 관련포스팅 [CodeEngn] Basic RCE L05 풀이 (UPX 패킹) [CodeEngn] Basic RCE L06 풀이 CodeEngn Basic RCE L14 풀이 임포트하는 함수중에 GetDigItemT..
CodeEngn Basic RCE L13 문제 확인 문제가 참 심플하다. 파일을 실행시켜 보니, password를 입력하게 되어있다. 이 password를 구하면 되는 문제인 것 같다. IDA로 열어봤는데 좀 이상해서 확인해보니 닷넷 프로그램이다. 닷넷 프로그램은 닷넷 디컴파일러로 확인을 해야 제대로 볼 수 있다. 닷넷 디컴파일러 중에 dotPeek이라는 무료 프로그램이 있다. 아래 링크에서 다운받을 수 있다. dotPeek, 무료 닷넷 디컴파일 툴 dotPeek: Free .NET Decompiler & Assembly Browser by JetBrains dotPeek is a free tool based on ReSharper. It can reliably decompile any .NET asse..
CodeEngn Basic RCE L11 풀이 패킹된 파일의 OEP와 Stolenbyte를 찾는 문제로 Basic RCE L09 문제와 거의 동일한 문제이다. Stolenbyte에 대한 설명은 [CodeEngn] Basic RCE L09 풀이 (StolenByte) 를 참고하기 바란다. CodeEngn Basic RCE L12 풀이 UPX로 패킹된 해당 파일의 EP는 pushad로 시작하고 있다. pushad 명령을 사용하면 현재의 레지스터 상태가 스택에 저장되게 된다. 그리고 OEP로 점프하기 직전에 저장한 레지스터를 복원할 것이기 때문에 레지스터값이 저장된 스택에 하드웨어 bp를 걸어주었다. 그럼 다음과 같이 popad로 스택에 저장되어 있던 레지스터 값을 다시 복원하는 부분에서 bp가 걸리게 된다...
CodeEngn Basic RCE L10 문제 확인 이전에 간간히 있었던 문제와 동일한 성향의 문제이다. 언팩을 통해 OEP를 구해야 하고 추가적으로 등록 성공 지점으로 가는 분기점의 옵코드를 구해야 한다. 파일을 실행시켜보니 아래와 같이 Name, Serial을 입력받게 되어있다. 여태까지 UPX 패킹만 나왔는데 이번엔 ASPack이 나왔다. 하지만 UPX이던 ASPack이던 간단한 패커이기 때문에 레지스터 백업과 복원의 위치에서 OEP로 뛰는 부분만 잘 찾아주면 된다. CodeEngn Basic RCE L10 분석 pushad로 처음엔 레지스터 상태를 백업하고 있다. 그다음 popad에 bp를 걸여주려 했는데 한개가 아니라서.. 스택에 하드웨어 bp를 걸기로 했다. pushad를 실행시키고 나서 스택..
CodeEngn Basic RCE L09 문제 분석 이번 문제는 StolenByte를 구하는 문제이다. StolenByte는 이 문제에서 처음 들어봐서 구글링해보니, 일종의 안티디버깅 기법이라고 한다. 의미 그대로 일부 코드 조각을 훔쳐서 다른 부분으로 옮긴 것인데 주로 OEP 주소의 코드를 따로 분리해서 OEP로 점프하기 직전에 push로 넘겨준다고 한다. 따라서 OEP를 찾아서 덤프를 떠서 언팩했다고 생각하고 실행하려고 하면 실행이 되지 않는 것이다. OEP의 옵코드 몇바이트가 JMP 직전에 있었기 때문에 OEP로 코드 조각이 오지 못했고, 예를 들어 함수의 인자값에 대한 push 옵코드였다면 함수의 인자가 충분하지 않으므로 실행에서 에러가 나게 되는 것이다. 이런 경우 소위 SolenByte라고 하..
CodeEngn Basic RCE L08 문제 확인 여태까지 나왔던 문제들과 비슷한 맥락으로 OEP를 구하는 문제이다. 일단, 실행시켜 보니 계산기 프로그램이다. 해당 문제는 아래 두 문제와 거의 유사하다. [CodeEngn] Basic RCE L05 풀이 [CodeEngn] Basic RCE L06 풀이 CodeEngn Basic RCE L08 풀이 UPX에서 OEP를 수동으로 언팩하는 방법은 위 포스팅에서 두번 설명했으므로 여기서는 패스하도록 하겠다. popad를 찾은 후 밑에 jmp 부분을 찾아 점프하면 OEP를 찾을 수 있다. 아래 부분이 OEP인 것으로 확인된다.
CodeEngn Basic RCE L12 문제 확인 성공메시지를 볼 수 있는 key값과 메시지박스에 key값이 나오도록 하려면 파일의 어느 영역을 key값으로 덮어쓰면 되는지를 묻고있다. 파일을 실행시켜 보니 다음과 같이 key값을 입력받고 있다. CodeEngn Basic RCE L12 풀이 문자열들을 보니 성공메시지와 관련한 문자열 "Congtratulation~"이 보인다. 해당 함수가 사용되는 함수로 가보니 성공메시지가 출력되려면 eax가 0x7A2896BF 여야 한다. 일단 key값으로 '123'을 줘보았다. GetDlgItemInt는 정수 입력값만 받기 때문에 그 외의 값을 주면 리턴값이 0이 되고 정수값이면 리턴값이 입력값이 된다. 123(0x7B)를 입력으로 주었기 때문에 eax에 0x7B..
바이너리 디핑 플러그인으로 bindiff, diaphora가 유명하다. 아마 diaphora보다는 bindiff를 많이 들어봤을 것 같다. 바이너리 디핑은 보통 바이너리의 패치 전후를 비교하거나 추가 취약점 발견을 위해서 많이 사용한다. bindiff 설치 및 사용에 있어서 삽질시간이 상당히 길었기 때문에 설치, IDa Plugin 설정, 사용방법 및 기타 에러 해결과정을 작성한다.참고로 IDA 플러그인으로 사용하는 것은 에러 발생없이 전부 잘됐는데 플러그인으로가 아닌 bindiff 프로그램을 사용하는 것에서 문제가 좀 있었다. 진행 환경은 윈도우10 x64에 파이썬 3.8, 자바 1.8.0_241이고 바이너리는 총 2개를 사용해봤는데 처음엔 바로 될줄 알고 실제 분석 예정이던 netcam arm파일을 ..
CodeEngn Basic RCE L07 문제 확인 컴퓨터 C 드라이브의 이름이 CodeEngn일 경우 시리얼이 생성되는데 시리얼 생성 과정에서 CodeEngn이 뭐로 변경되는지를 묻고 있다. C 드라이브 이름을 가져온는 것과 관련된 윈도우 API가 사용될 것이고 가져온 이름을 사용해서 시리얼을 생성하나보다. 아래와 같이 시리얼을 입력받고 있다. CodeEngn Basic RCE L07 분석 시리얼을 맞게 입력했다는 문자열이 사용되는 함수로 먼저 가본다. 해당 함수로 가보니 GetVolumeInformationA라는 C드라이브의 이름을 가져올 것만 같은 API가 쓰이고 있다. 그리고 인자를 여러개 받는데 두번째 인자로 VolumeNameBuffer가 push되고 있다. 이 변수에 C 드라이브 이름이 저장..
CodeEngn Basic RCE E06 풀이 언팩 과정에서 OEP를 찾고, 시리얼도 추가적으로 찾는 문제이다. 파일을 실행시켜 보니, 아래와 같이 시리얼을 입력받도록 되어있다. CodeEngn Basic RCE L06 분석 수동 언패킹 과정은 L05 문제에서 했던 방법과 같다. upx 패킹은 초반에 아래와 같이 pushad로 레지스터 정보를 스택에 전부 백업해놓는다. 그리고 아래와 같이 명령어 찾기로 popad를 찾아주고 실행시켜보면, 백업해두었던 스택의 레지스터 값들이 전부 복원된 것을 볼 수 있다. 그리고 그 밑에 jmp에 bp를 걸어주고 실행시킨 후 jmp하는 위치로 가보자. 이렇게 OEP를 찾을 수 있다. 수동으로 언팩을 하려면 OEP, IAT, Imports를 맞춰주어야 하는데 다행히도 X32..
CodeEngn Basic RCE E05 문제 확인 등록키를 찾아내는 문제이다. Register을 누르면 잘못된 시리얼이라며 다시하라는 경고창이 뜬다. CodeEngn Basic RCE E05 분석 IDA로 열어보니 해당 바이너리는 UPX 패킹이 되었음을 알 수 있다. UPX는 매우 간단한 패킹이기 때문에 툴을 사용하면 금방 언팩할 수 있지만, 수동으로 OEP를 찾고 덤프를 떠보려 한다. 대부분의 패킹 알고리즘은 처음에 pushad로 레지스터들의 현재 상태를 스택에 전부 백업을 시켜둔다. 아래 스택창을 보면 EDI부터 EAX까지 스택에 저장되었음을 알 수 있다. 그럼, popad를 하면 백업해둔 레지스터들이 그대로 복원된다. popad를 한다음 OEP(Original EP)로 뛰는 경우가 많기 때문에 p..