#CodeEngn advance L03
: Name이 CodeEngn 일때 Serial은 무엇인가
드디어 코드엔진 basic을 다 끝내고 어드밴스드로 넘어왔다... !
순서대로 풀기보다는 잘 풀리는거 먼저 풀고 나머지를 차근차근 풀어보려고 한다.
시리얼 값을 구하는 문제였는데 이게 왜 어드밴스드에 있는지 모르겠는...너무 쉬운 문제였다.
string 찾기로 보니 마지막에 있는것이 성공메세지인 것 같다.
이름과 시리얼을 입력하고 체크를 누르면 되는 것 같아서 name부분에 CodeEngn을 넣어주고 serial에 아무거나 넣어주었다.
이런 경고창이 나왔고 올리디버거에서 다시 살펴보았다.
그랬더니 1234를 3265754874와 비교하고 있는게 너무 잘보였던 문제였다.
위에서 나온 3265754874을 입력하니 성공메세지가 나온다 ! :)
#CodeEngn advance 05: Serial 을 구하시오
visual basic
string은 정답과 관련된 것이 딱히 없어서.. 함수부터 찾았다.
vbaStrCmp: 비주얼 베이직 프로그램에서 문자열 비교 함수
BP걺 -> F8 -> F9 실행
값 입력: 1234
Bp 걸어둔 부분에서 걸림
오른쪽 R부분 보면, 1234 밑에 677345 (: ECX 값)가 시리얼값이라 추측.
vbaStrCmp 함수 - BP 걸린 저곳에서 입력받은 값 vs 시리얼 값 비교 -> 같은지 판단할 것
# Code Injection
타깃 프로세스에 독립 실행 코드를 삽입한 후 실행하는 기법
어떤 프로그램이 메모리에 올라와서 프로세스가 되었을 때
특정 코드를 삽입해서 그 프로세스를 빼앗아서 내가 원하는 것을 실행하는 것이지요
정상적인 프로세스에 악성적인 코드를 넣는 형태로 많이 쓰이는 공격 기법이라고 합니다.
운영체제에서 이벤트를 발생시키기 위해서는 코드와 코드 동작에 필요한 데이터가 필요하고,
이제 운영체제에게 “코드 시작지점이 여기야”라고 잘 알려주기만 하면 된다.
Code Injection은 이런 점을 이용해서 타깃 프로세스에 코드와 데이터를 삽입하고 호출하는 기법
DLL Injection과 원리자체는 동일하다고 하네요
(하지만, 이거는 타깃 프로세스에 이미 LoadLibrary( )코드가 있었기 때문에 따로 삽입할 필요가 없었던 것)
쓰이는 API
이건 인터넷에 예제로 올린 분꺼 퍼온 사진인데 이렇게 API가 쓰인다는 것을 보여주고 싶어서 긁어왔어요
Code Injection의 장점, 왜 코드 인젝션인가?
1. 메모리 차지가 적다
2. 흔적을 찾기도 힘들다
별도의 DLL 파일을 만들지 않아도 되기 때문에
자 원리 사진
방금 핸들로 알아낸 주소에 이렇게 코드 인젝션해서 스레드에 은근슬쩍 끼워들어가기
찾아보니까 부모 자식간 관계를 이용해서 공격하는 거래요
우리가 운영체제를 제대로 배우지 않아서 이게 무슨 말인가 아직 생소할 수 있는데 이렇게 원래는 카카오톡 밑에 카카오톡 있어야하는데, 이건 성공해서 메모장이 밑에 있어용
# API Hooking
1. IAT 영역 - IAT에 있는 API 주소를 후킹 함수 주소로 변경하는 방법
단순하고 구현 방법이 쉽지만, 프로그램이 직접 호출 방식을 사용하는 경우 구현할 수 없음!
함수 호출 시에 IAT에 저장된 ex) WriteFile() 함수의 라이브러리 주소로 이동하는데, 이를 바꾸게 되면 이 함수를 호출할 때마다 코드의 흐름이 변경된 주소로 이동함
2. DLL 영역 – 메모리에 로드된 시스템 라이브러리(DLL)의 API 실제 주소로 찾아가서 코드를 직접 수정하는 방법
가장 많이 사용되는 방법,
1) 시작 코드를 JMP 명령어로 패치하는 방법
2) 함수 일부를 덮어쓰는 방법
3) 필요한 부분만 일부 변경하는 방법
이번 장에서도 ‘DLL Code 영역_시작 코드를 JMP 명령어로 패치하는 방법’에 대해 살펴볼 것!
목표: notepad.exe에서 작성한 문서가 암호화 저장되도록 하기
3. DLL EAT 영역 – DLL의 EAT에 기록된 API 시작주소를 후킹 함수 주소로 변경하는 방법
개념에 비해 코드 구현이 복잡하고 비효율적임
코드 학습
NewWriteFile() 함수: notepad.exe에서 WriteFile() API를 호출할 때 전달하는 평문 문자열을 암호화하는 함수로, WriteFile() API 시작 지점에 Hook을 설치한 결과로 코드 흐름이 NewWriteFile() 함수로 변경된다.
[개요]
1. WriteFile() API를 호출할 때 전달하는 인자 값을 그대로 전달받는다.
2. WriteFile() API의 두 번째 인자에는 텍스트 파일로 저장하고자 하는 문자열 위치 정보가 들어 있는데, 이를 이용해 문자열을 암호화하고 저장할 것이다.
3. 암호화된 문자열을 저장할 때, NewWriteFile() 함수 내부에서 WriteFile() API를 호출해야한다. 그런데 지금 Hook이 걸려있는 상태이므로 정상적으로 호출이 이루어지기 위해서는 WriteFile() API 시작 지점에 설치된 Hook를 풀어야한다. 즉 Hook를 먼저 풀고, 암호화된 값을 두 번째 인자로 넣은 후에 WriteFile() API를 호출하면 된다.
4. 암호화된 데이터가 텍스트 파일로 만들어졌으므로 3단계에서 호출한 WriteFile()에 대한 리턴 값을 notepad.exe로 넘겨주면 된다.
5. 이 때, 3에서 hook를 풀었으므로 저장하는 텍스트 파일을 평문으로 저장될 것이다. 4에서 notepad.exe로 리턴 값을 돌려주기 전에 다시 hook을 걸어줘야한다.
'2. Reversing (리버싱) > 1) Write UP' 카테고리의 다른 글
[2021.09.25] CodeEngn Basic RCE L05, L06 풀이 (0) | 2021.09.25 |
---|---|
[2021.09.18] CodeEngn Basic RCE L03, L04 풀이 (1) | 2021.09.18 |
[2021.05.15] reversing.kr , suninatas, xcz & 교재 6장(dll), 8장 (0) | 2021.05.15 |
[2021.05.08] CodeEngn Basic 16~20 write-up / 교재 5,6장 (0) | 2021.05.08 |
[2021.05.01] CodeEngn 11-15 & 교재 4장 (0) | 2021.05.01 |