CodeEngn Basic RCE L16 문제 확인 CodeEngn Basic RCE L16 문제는 L14, L15 문제와 동일하게 Name이 CodeEngn일 때의 시리얼 값(여기서는 password 값)을 찾는 문제이다. 파일을 실행시켜보니, 아래와 같이 Name과 Password 값을 받고 있다. CodeEngn Basic RCE L16 풀이 CodeEngn Basic 문제들은 대부분 string에서 관련 문자열을 찾으면 대부분 정답에 근접해질 수 있게끔 구성이 되어있다. 이번에도 역시 Password 체크 분기문에 접근할 수 있는 'Godd Job'이라는 문자열을 사용하는 함수를 찾는 것에서부터 문제 풀이를 시작한다. 해당 문자열이 사용된 함수로 가보니, 아래와 같이 password를 체크하는 분..
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를 실행시키고 나서 스택..
QEMU 에뮬레이터와 QEMU에 가상으로 실행시키고 싶은 공유기 펌웨어를 사용해 가상 공유기 환경을 구축하고 실행시켜보려고 한다. 구축 환경은 우분투 x64이고 펌웨어는 제조사 웹사이트에 공개된 펌웨어를 다운로드, 파일시스템은 MIPS로 사용했다. - 환경 : Ubuntu x64 - 펌웨어 : 제조사 웹사이트에 공개된 구버전 펌웨어 - 파일시스템 : MIPS QEMU 설치 QEMU는 apt-get으로 쉽게 설치할 수 있다. 처음엔 qemu를 설치해야 하는 것인지 아니면 mips이기 때문에 qemu-system-mips64를 설치해야 할지 고민했는데 qemu를 설치하면 mips64도 같이 설치되는 듯 했다. QEMU squeeze/wheezy mips 이미지 다운로드 QEMU를 설치했으면 이제 QEMU s..
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라는 바이너리 디핑 툴을 설치하고 간단히 사용법을 알아보았는데 삽질만 하고 끝내면 아쉬우므로 이번엔 실제로 사용해보려 한다. 실제 제조사 웹페이지에 공지사항으로 올라온 '한국 인터넷 진흥원(KISA)의 보안 규격 적용'을 기반으로 패치전의 구버전 펌웨어와 패치후의 펌웨어를 다운받아서 디핑을 이용해 어떤 패치가 이루어졌는지 대략적으로 살펴보기로 했다(패치전 펌웨어: V1.2.4 / 패치후 펌웨어: V1.2.9). 관련포스팅 바이너리 디핑을 위한 bindiff 설치 및 사용법 바이너리 디핑을 위한 bindiff 설치 및 사용법 바이너리 디핑 플러그인으로 bindiff, diaphora가 유명하다. 아마 diaphora보다는 bindiff를 많이 들어봤을 것 같..
바이너리 디핑 플러그인으로 bindiff, diaphora가 유명하다. 아마 diaphora보다는 bindiff를 많이 들어봤을 것 같다. 바이너리 디핑은 보통 바이너리의 패치 전후를 비교하거나 추가 취약점 발견을 위해서 많이 사용한다. bindiff 설치 및 사용에 있어서 삽질시간이 상당히 길었기 때문에 설치, IDa Plugin 설정, 사용방법 및 기타 에러 해결과정을 작성한다.참고로 IDA 플러그인으로 사용하는 것은 에러 발생없이 전부 잘됐는데 플러그인으로가 아닌 bindiff 프로그램을 사용하는 것에서 문제가 좀 있었다. 진행 환경은 윈도우10 x64에 파이썬 3.8, 자바 1.8.0_241이고 바이너리는 총 2개를 사용해봤는데 처음엔 바로 될줄 알고 실제 분석 예정이던 netcam arm파일을 ..