일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- wargame
- Payload
- 운영체제
- Operating System
- Shell code
- hacking
- 정보보안기사
- pwnable
- 해킹
- BOF
- 웹해킹
- PWN
- system hacking
- webhacking.kr
- Pwnable.kr
- 네트워크
- webhacking
- SQL
- Lord of BOF
- Buffer Overflow
- 워게임
- stack overflow
- Spring
- System
- Spring Framework
- 정보보안기사 실기
- OS
- Spring MVC
- LOB
- 정보처리기사 실기
- Today
- Total
DongDD's IT
리버싱 예제 - abex crackme2 본문
리버싱 예제 - abex crackme2
Problem
맨 왼쪽은 시작화면이고 Name과 Serial을 입력받을 수 있는 텍스트 창과 버튼 3개로 이루어져있다. 아무것도 입력하지 않았을 시 최소 4자리 이상의 name을 입력해달라는 message가 출력되고 Name을 입력한 후 다시 눌렀을 때는 serial이 일치하지 않는다는 message가 출력된다.
입력한 Name과 Serial이 어떠한 검사를 통해 일치하다는 것이 확인되면 통과할 수 있는 문제인 것 같다.
Analysis
Ollydbg를 통해 실행하면 Entry point(0x00401238)에서 프로그램이 시작된다.
먼저 Code->Search for -> All referenced strings를 통해 출력되었던 message를 찾아보았고 위 부분이 4자리 이상의 Name이 아닐 때 동작하는 코드이다. vbaLenVar를 통해 입력한 Name의 길이를 알아내고 길이를 저장하는 역할인 것 같다. 함수 종료 후 0x18F338에 입력한 Name의 길이가 저장되는 것을 볼 수 있다. 그 후에 vbaVarTstLt를 통하여 문자열의 길이가 4이상인지 확인하여 맞다면 TEST를 통해 바뀐 flag를 이용해 JZ를 통해 다음 단계로 넘어가고 아니라면 아무것도 입력하지 않았을 때 보았던 message가 실행된다.
Serial를 생성하는 전체적인 부분이다. 일부만 참조했지만 전체 부분을 보면 입력받은 Name의 길이만큼 반복문을 수행하며 한 문자마다 Serial로 변환해주는 과정이다.
전체적인 과정은 위와 같다. Name에서 한 글자를 가져와 #516으로 들어가 문자를 Serial로 변환하기 위해 Ascii Hex code로 변환한다. 이 함수의 return값(eax)은 문자의 Hex code로 변환된 값이다. 이 값을 [EBP-0D4]에 저장한다. 그 이후 vbaVarAdd를 통해 변환된 Ascii hex code에 특정 값을 더한다. 마지막으로 #573으로 들어가 더한 값을 다시 문자로 바꿔준다. 이 후 한 글자씩 읽어오며 같은 방식으로 문자열의 끝 문자까지 수행한 다음 생성된 Serial과 입력한 Serial이 일치하는지 확인한다.
varadd의 일부분이다. 사실 이부분이 더하면서 Serial을 생성하는 부분이지만 코드가 너무 복잡해 제대로 이해하기가 너무 어려웠다. 정확한 이해는 하지 못했지만 check가 끝난 후 생성된 serial과 이 함수와 이 함수 시작전의 부분을 보고 어느 정도 파악을 했다. 일단 이 함수를 시작하기 전에 64의 값을 stack에 넣어주는 부분이 있었다. 이 프로그램은 생성된 serial을 stack에 저장하는데 그 부분과 이 부분을 생각해보아 serial이 생성되는 알고리즘을 알 수 있었다.
코드가 너무 복잡해서 완벽한 분석을 하지는 못했다.
Solution
1) 프로그램 종료 후 Stack을 확인
Serial을 생성하는 모든 Loop를 돈 후 stack에 저장되어있는 값을 보면 Serial Number를 알 수 있다. Name에 "1234"를 입력했을 때 생성되는 Serial Number는 "95969798"인 것으로 추측되었고 이 값을 넣고 check를 실행하니 통과할 수 있었다.
2) Stack을 통해 확인한 Serial과 분석한 내용 조합
"1234" -> "95969798"이라는 serial 생성이 된 것과 아까 분석하며 여러가지 얻었던 정보를 조합해보면 이 Serial이 어떻게 생성되는지 예측할 수 있었다. 분석하면서 눈에 띄었던 stack에 넣어주는 64값을 생각해보면 다음과 같이 Serial이 생성되는 것 같다.
입력 받은 문자를 Ascii hex code로 바꾼 후 64를 더한 후 다시 문자열로 바꿔주는 것 같았다.
즉, 1(31) + (64) = 95, 2(32) + (64) = 96, 3(33) + (64) = 97, 4(34) + (64) = 98, 이런 식으로 Serial이 생성된다고 추측되었고 이것을 이용해 다른 Name과 해당 Name에 대한 Serial을 계산해 넣어보니 통과할 수 있었다.
References
Code -> Anaysis에서 3가지 선택지를 볼 수 있다.
1) Anayse code : Ollydbg가 사용자가 보기 쉽게 LOCAL.X 등의 방식으로 표현해주는 방법이다.
2) Remove analysis from selection : 현재 선택된 LOCAL.X와 같이 표현되어 있는 명령어를 EBP-0xXX와 같은 형태로 Register EBP의 상대주소로 표현해준다.
3) Remove analysis from module : 프로그램 전체 코드의 LOCAL.X와 같이 표현되어 있는 명령어를 EBP-0xXX와 같은 형태로 Register EBP의 상대주소로 표현해준다.
Stack -> Addressing 부분에도 3가지 선택지가 있는 것을 볼 수 있다.
1) Relative to selection : 주소값으로 표현된다.
2) Relative to ESP : ESP Register의 상대주소로 표현된다.
3) Relative to EBP : EBP Register의 상대주소로 표현된다.
후기
1번 문제와 비슷하게 문제 해결은 stack을 보고 쉽게 해결할 수 있었지만 코드 분석은 너무 어려웠던 것 같다. 아직 분석하는 방법에 대해 잘 몰라서 오랜 시간이 걸렸고 완벽하게 파악하지도 못한 것 같다. 답을 얻어내기는 쉬운 문제였지만 코드 분석을 하기는 어려운 문제인 것
'IT 보안 > Reversing' 카테고리의 다른 글
Register 및 어셈블리어, Calling Convention, Endian (0) | 2017.12.29 |
---|---|
리버싱 예제 - abex crackme1 (0) | 2017.12.12 |
리버싱 도구 소개 - PEView, Ollydbg (0) | 2017.12.05 |
리버싱 기초 지식 - Reversing,프로그램 실행 구조, Register, Stack, PE (0) | 2017.12.04 |