일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 버퍼오버플로우
- 알고리즘
- BOJ
- 스트림암호
- 백준
- 딥러닝
- C언어 알고리즘
- 신경망구현
- 인공지능
- 보안
- BOF
- 달고나bof
- 신경망 학습
- 머신러닝
- 딥러닝파이썬
- C알고리즘
- 파이썬신경망
- 신경망
- 소프트맥스함수
- 신경망파이썬
- 파이썬
- 활성화함수파이썬
- 정보보안
- 8086CPU레지스터
- 밑바닥부터시작하는딥러닝
- FTZlevel10
- 백준알고리즘
- c언어
- 항등함수
- C언어알고리즘
- Today
- Total
목록<CTF>/<CodeEngn> (10)
HeeJ's
문제 화면을 우선 확인해 주었다. 디버거 프로그램을 탐지하는 함수의 이름을 찾는 문제이다. 위의 프로그램을 실행해보았더니, 일정 시간마다 '정상'이라는 문자열을 출력해주었다. 이 프로그램은 디버거 프로그램을 감지한다고 하였기 때문에, 디버거 프로그램으로 위의 프로그램을 열어 실행시켜보았다. 그러자 일정 시간 마다 '디버깅 당함'이라는 문자열이 출력되었다. 함수의 이름을 찾아야 하기 때문에 [Search for]-[All intermodular calls]를 통해 프로그램의 모든 함수의 이름을 살펴보았다. 햠수 명들 중에서, 의심이 가는 함수 이름이 보인다. IsDebuggerPresent라는 함수이다. 이 함수는 안티디버깅 중의 한 방법이다. 위의 함수가 사용된다면, 디버거를 통해 프로그램을 분석할 수 ..
OEP를 구하면 되는 문제기에 바로 디버거로 열어주었다. 역시 PUSHAD로 패킹되어있는 것을 확인할 수 있다. 다른 문제들과 같이 upx를 이용해서 언패킹해준다. 그리고 다시 디버거를 사용하여 열어주면 OEP를 확인할 수 있다.
우선 실행 파일을 실행시킨 후, 예시의 Serial 값을 넣어보았다. 틀렸을 때 나타나는 문자열을 확인할 수 있었다. 디버거로 바로 열어보았다. PUSHAD로 실행이 시작되는 것으로 보아, 패킹된 실행파일이라는 것을 알 수 있다. 이 파일을 우선 언패킹 해주었다. cmd를 관리자 권한으로 실행시켜주어야 언패킹을 할 수 있다. PUSHAD부분이 풀려 명령어들로 나열되어있는 것을 확인할 수 있다. OEP는 프로그램 실행 시작점의 주소를 말한다. OEP는 00401360임을 확인했다. 그리고 Serial 값을 찾기 위해 문자열 검색을 통해 아까 에러 문자열을 찾아가주었다. 분기문 근처에 SERIAL로 보이는 ASCII값을 확인하고, 실제 SERIAL이 맞는지 확인하기 위해 실행파일을 실행시킨 후 값을 넣어보았..
비주얼 베이직에서 스트링 비교 함수의 이름은 vbaStrCmp이다. 위의 실행파일을 분석해보아도, vbaStrCmp 함수가 자주 사용되는 것을 확인할 수 있다.
실행파일이 손상되었다고 한다. 여러 분석 툴들로 열어줄 수 있을지는 모르겠지만, 우선은 그냥 실행시켜보았다. 그냥 실행시키게 되면, 이렇게 앱을 실행할 수 없다는 문구가 뜬다. 이걸 그대로 바로 디버거로 열어보아야겠다. 디버거에서 또한 파일을 열 수 없다. 그래도 파일에 어떤 내용이 들어있는지 알아봐야 하기 때문에 String으로 파일을 확인할 수 있는 HxD로 열어보았다. 실행파일에 사용하는 여러 함수들을 확인할 수 있었다. 이 파일들을 더 살펴보면, password를 찾을 수 있을 것이다. 패스워드로 유추되는 문자열을 획득했다. 위의 값을 입력해 문제를 해결했다.
문제 힌트를 읽어보면 HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는가라고 적혀있다. 이 문제 힌트를 먼저 해결한 후, exe 파일을 열어보려고 한다. 위의 힌트를 해결하기 위해 GetDriveType 함수를 찾아보았다. GetDriveType 함수의 원형은 UINT WINAPI GetDriveType( _In_opt_ LPCTSTR lpRootPathName ); 이며 이 함수는 인자로 전달받은 드라이브가 어떤 종류의 드라이브인지 판별하여 리턴해줍니다. 이제 리턴 값들에 대해 알아보면 힌트에 대한 답을 찾을 수 있을 것이다. 리턴 값 상수 설명 0 DRIVE_UNKNOWN 알 수 없음 1 DRIVE_NO_ROOT_DIR 최상위 경로가 없음 2 DRIV..
문제: 이 문제도 역시 실행파일을 통해 Serial을 찾는 문제다 바로 Ollydbg로 열어주고 text strings를 통해 성공, 실패 분기 부분을 찾아주었다. 저 부분에 들어가서 윗부분에 다른 문제들(L16)과 같이 CMP 구문을 찾아주려 했다. 하지만 CMP구문은 찾을 수 없었고, 그 대신 조건 점프 명령어인 JE를 찾을 수 있었다. 그렇다면 윗 부분에서 무엇을 검사해준 다음, 이 부분에서 분기를 한다는 것 바로 윗 부분에서 lstrcmpiA 함수를 찾을 수 있었는데, 이 함수는 문자열을 비교해주는 함수이다. 그래서 이 함수 바로 밑 부분에 bp를 걸고 실행시켜 보았다. 아무 값을 넣어준 후 check를 누르면 String1에는 내가 넣어준 Serial값이, String2에는 어떠한 문자열이 뜨는..
문제: 16번 문제도 15번과 동일하게 Serial을 찾는 문제로, 일단 실행시켜보았다. 이런 실행 창을 얻을 수 있었고, 바로 Ollydbg로 분석해보았다. 분기문을 찾기 위해 성공과 실패를 가르는 String을 찾아주었고, " Good Job! "이라는 문자열을 더블 클릭해 들어가주었다. 위 쪽으로 보다 보면, CMP구문을 찾을 수 있었고 이 부분에 bp를 걸어준 다음 실행시켜보았다. CMP 구문에서 EAX와 DOWRD PTR SS:[EBP-3C]를 비교해주는 것을 확인하고 (EBP에서 3C를 뺀 메모리 주소에 저장된 값) 값을 입력해주었더니 EAX에는 내가 입력해 준 값이 들어있는걸 확인할 수 있었고, EBP는 0070FF28이라는 것을 알 수 있다. 여기서 3C를 빼주면 00 70 FE EC 주소..