일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 보안
- 소프트맥스함수
- 백준
- C언어 알고리즘
- 알고리즘
- 활성화함수파이썬
- 파이썬
- 파이썬신경망
- 신경망
- 밑바닥부터시작하는딥러닝
- 스트림암호
- 신경망구현
- C알고리즘
- 버퍼오버플로우
- 신경망 학습
- BOF
- 인공지능
- 달고나bof
- 백준알고리즘
- 머신러닝
- 딥러닝파이썬
- 8086CPU레지스터
- 딥러닝
- BOJ
- 신경망파이썬
- 항등함수
- C언어알고리즘
- c언어
- FTZlevel10
- 정보보안
- Today
- Total
HeeJ's
[02] LENA reversing tutorial 본문
2번 reverseMe.exe를 실행시켰는데, 바로 Congratz가 뜨기에 당황했지만,
잘 보면 폴더에 Keyfile이 존재한다. 이 파일을 만드는게 2번 문제의 목적이라고 한다.
keyfile을 지워주고 다시 실행시켜보았다.
그러자 라이센스가 만료되었다고 새 라이센스를 구입하라는 창이 떴다.
올리디버거로 열어보았다.
[F8]로 실행 시키다가 보니, CreateFileA라는 함수가 나왔다.
CreateFileA 함수는 '파일 또는 I/O 장치를 만들거나 여는 것'을 수행한다.
여기서 "Keyfile.dat" 파일을 불러오는 것 같다.
계속하여 실행해주더니 Keyfile이 없어서인지 오류 메세지가 출력되고, 프로세스가 종료되었다.
그렇다면 Keyfile.dat를 생성하고, 이에 라이센스가 들어가 있다면 문제를 해결할 수 있을 것이다.
reverseMe.exe가 들어있는 폴더 안에 메모장을 생성하고, 이름을 Keyfile.dat로 설정해주었다.
그리고 우선 아무 값이나 넣어주고 저장시켜주었다.
[Ctrl] + [F2]를 통해 ollydbg를 다시 실행시켜주었다.
Keyfile.dat이 생성되었기 때문에 CreateFileA 함수에서 다른 곳으로 JMP가 진행될 것이다.
역시 다음 함수인 ReadFile로 넘어올 수 있었다.
ReadFile을 실행시켜주다보니 아까 CreateFileA 함수에서 EAX에 들어있던 값이 hFile에 들어가는 것을 확인할 수 있다.
ReadFile의 Buffer에 들어가는 값을 확인하기 위해 Hex dump 창에서 [Go to] - [Expression] 을 통해
0040211A를 검색해주었다.
그러자 아까 Keyfile.dat를 생성하여 넣어준 임의의 값이 들어있는 것을 확인할 수 있다.
또한 ReadFile 함수의 pBytesRead 변수는 몇 바이트를 읽었는지 저장해주는 변수이다.
위의 변수의 값이 저장되어 있는 주소(00402173)도 찾아가서 확인해보았다.
Little Endian 방식으로 읽으면 00 00 00 04 Byte가 저장되어 있는걸 확인할 수 있다.
Keyfile.dat 라는 파일이 존재하기 때문에 ReadFile이 정상적으로 작동하여 JNZ 명령어가 실행되었다.
그 다음, 두 번의 XOR 연산으로 EBX와 ESI를 00000000로 초기화해주었다.
그 다음 명령어 부분을 보면, 00402173 주소와 '10'이라는 값을 비교하고 있다.
아까 00402173은 pBytesRead가 있던 곳으로, 4자리를 넣어주었기 때문에 '4'라는 숫자가 들어있었다.
계속 실행하다보면, Keyfile이 유효하지 않는다는 메세지가 뜬 것을 확인할 수 있다.
그렇다면 Keyfile.dat의 값을 10(16)Byte로 변경한다면 위의 CMP는 성공할 수 있을 것이다.
즉, Keyfile.dat의 값을 16byte로 변경해주었다.
그리고 다시 실행시켜주자, JL이 실행되지 않았다.
그러면 이어서 명령어를 살펴보자
MOV 명령어이다.
MOV A B 라고 한다면, B를 A에 넣어준다.
즉, EBX + 40211A의 값을 AL에 넣는다는 것이다.
EBX는 아까 XOR 명령어를 통해 초기화해주었으므로,
20411A에 해당하는 덤프로 이동해주었다.
아까 Keyfile.dat에 임의로 넣어준 값이 들어있는 것을 확인할 수 있었다.
그리고 이 MOV 명령어를 실행시켜 보았다.
AL에는 아스키코드로 '1'을 뜻하는 31이 들어가게 된다.
다음 명령어에서, AL과 0을 비교하기 때문에 JE가 실행되지 않는 것을 확인할 수 있다.
그 다음, Keyfile의 데이터를 하나씩 불러와 AL에 옮기고, 아스키코드 47과 비교하는 부분이다.
47은 아스키코드로 'G'를 뜻한다.
이를 8번을 반복하게 된다.
그렇기 때문에 Keyfile의 앞의 8글자를 G로 바꾸어주고 다시 실행시켜보았다.
성공
'<CTF> > <LENA tutorials>' 카테고리의 다른 글
[08] LENA reversing tutorial (0) | 2021.11.23 |
---|---|
[03] LENA reversing tutorial (0) | 2021.11.10 |
[01] LENA reversing tutorial (0) | 2021.10.05 |