일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 자바스크립트
- leetcode
- 코딩테스트
- lab03-03.exe
- 악성코드분석
- 사이버보안
- 다해요
- 투두리스트
- toVillage
- 리버싱
- 릿코드
- to-do
- N-ary Tree Preorder Traversal
- dualtable
- orcle
- 투빌리지
- 취업준비
- 사이드프로젝트
- JavaScript
- 마을짓기
- 악코분
- 가차시스템
- 대학생
- JS
- 균형이진트리
- gamification
- TODOLIST
- Practicalmalwareanalysis
- 듀얼테이블
- 토이프로젝트
- Today
- Total
이것저것
과제 1주차 abex crackme 1 본문
나는 바보다. 아니 근데 진짜 좋은 아이디어라고 생각한다고!
지금부터 시작합니다.
이번에 받은 과제는, 아래처럼 뜨는 프로그램을 실행시켰을때 정상적인 출력을 보이라는 말 같았다.
그럼 정상실행됐을 때 결과가 어떻게 떠야하는데???
어떻게 해야할지 모르겠어서 일단 OllyDbg를 켰다.
뭔지는 모르겠지만 어셈블리 코드 화면을 보니까
"YEAH!"
"Ok, I really think that your HD is a CD-ROM! :p"
이라고 되어있는 부분을 볼 수 있다. (이 부분을 Correct 함수라고 하겠다.)
아! 그렇다면 CD-ROM이라고 생각하고 있는 메세지를 띄워줘야하는구나!
그럼 어떻게 해야할까?
해결 방안을 생각하기 전에 강의시간에 뭘 배웠는지부터 잠깐 고민해봤다.
- 스택프레임
우선 어떻게 문제를 해결했는지 설명하기에 앞서 스택프레임이 뭔지 간단하게 짚고 넘어가보자.
스택프레임이란?
스택 영역에 함수를 구분하기 위해 생성되는 공간으로서, parameters, return address, local variables (매개변수, 복귀 주소, 지역 변수)를 포함하고 있다.
조금 더 풀어서 설명을 하자면... 메모리의 구조는 다음과 같다.
함수가 하나 실행이 될때마다 스택 영역에서 "함수를 구분하기 위해서" 스택 프레임이 생성된다.
이때, 스택 프레임의 주소는 ESP, EBP 두 개의 레지스터에 저장이 된다.
ESP 레지스터란?
현재 레지스터의 최상단 주소값을 저장하는 레지스터
EBP 레지스터란?
현재 스택 프레임의 베이스 주소를 저장하는 레지스터
그럼 두번째 함수가 실행이 되면 어떻게 되는거지?
ESP와 EBP의 값을 어떤 방법으로 바꿔줘야, 첫번째 함수의 스택프레임 주소도 가지고 있으면서 두번째 스택 프레임을 생성할 수 있을까?
이걸 우리는 함수 프롤로그라고 부른다!
함수 프롤로그란?
새로운 함수를 위해 스택 프레임을 생성하는 과정을 이야기한다.
PUSH EBP // 이전 스택 프레임으로 돌아오기 위해 정보를 저장
MOV EBP ESP //현재 ESP 주소를 EBP에 저장
그래서 새로운 함수를 실행하게 되면 스택 영역에서는 아래 사진과 같은 모습을 보인다.
드디어 스택 프레임에 대한 얘기가 끝났다! 난 진짜 열심히 했어!
그럼 이제 다시 처음으로 돌아가서 생각하자
나는 이제"아 이 프로그램은 이런 형태가 아닐까?" 라면서 다음과 같은 그림을 머리속으로 상상할 수 있다.
저 Error 반환 함수를 Correct 함수가 되도록 해야겠구나!라고 생각을 했는데, 갑자기 머릿속에 하나 재밌는 생각이 떠올랐다.
(어느날 새벽 시간)
신쥔 : 아니..호출되는 함수를 바꿔줘야해? 왜? 그냥 Error 반환 함수 내용을 Correct 함수의 내용으로 바꿔주면 안되는거야?
- MessageBox의 문자열 패치
그래서 DUMP에서 MessageBox의 내용 수정(Ctrl + E)를 해주었다.
뭔가 많이 잘못됐다. 정말로
내가 원했던 결과물은
빨간색 체크해둔 부분에서
Title = "YEAH!"
Text = "Ok, I really think that your HD is a CD-ROM! :p"
로 수정이 되길 바랬던건데 왜 이런 문제가 발생했을까?
찾아보니까, 이 방법은 버퍼 내의 내용을 직접 수정하는 것으로 원래의 문자열보다 수정할 문자열이 더 길면 메모리를 침범할 수 있다고 한다.
그런데 이게 단순히 메모리 침범 문제일까?
유레카!!!!!!!!!!!!!!!!!!NULL!!!!!!!!!!!!!!!!!!!!!!!!! 모든 문자열 끝에는 마지막임을 알려주는 NULL이 자동으로 삽입이 된다.
그러나 방금 내가 한 행동은 널문자가 자동으로 들어가지 않았다.
흔히 문자열을 읽어올때는, 문자열을 끝 주소를 기억해두는게 아니라 NULL까지 읽어온다. 그럼 NULL 삽입하면 내가 원하는 결과를 출력할 수 있을거 같다는 생각을 했다.
초기화(Ctrl + F2)를 한 후 어셈블리 코드 화면과 DUMP 화면을 다시 보자.
그렇지. 00이 NULL이다.
이제 Title, Text에 해당하는 각각의 문자열의 마지막에 NULL을 집어넣으면..?
해결했다.
근데 이걸 과제...결과물로 내도 될까?
출처
http://www.tcpschool.com/c/c_memory_structure
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
[리버싱] Messagebox 문자열 패치
1. 버퍼내의 내용을 바로수정하기 ㄴ 원본 문자열보다 수정 할 문자열이 길면 뒷 메모리를 침범 당할 가능성이 있어서 추천 하지 않음. 2. 적당한버퍼(Null padding)에 문자열을 넣어서 MessageBox가 호
ggn0.tistory.com
'전공 > 악성코드분석' 카테고리의 다른 글
기초정적분석하기, Lab 01-02.exe (0) | 2022.11.06 |
---|---|
오랜만에 쓰는, Lena tutorials 3! (0) | 2022.10.04 |
IAT 총정리 (0) | 2022.10.04 |
lena tutorials 2, JUMP로 해결하기 (0) | 2022.09.27 |
과제 1주차 abex crackme 2 (0) | 2022.09.18 |