티스토리 뷰
Help_About
Help_Register
아무값이나 입력하면 다음과 같은 창이 뜬다.
Register창이 뜨는부분에 breakpoint를 걸고 따라가보았다.
메인코드
CALL DialogBoxParamA()함수를 통해 Register창을 띄우고
값을 입력한뒤 돌아오면 위의 상태이다.
ASCII로 내가 입력한 값이 들어가있는것을 확인할 수 있다.
회색 음영라인에서 CMP비교후 JE 점프문에 의해 분기가 나뉘는게 보인다.
분기가 나뉜후, CALL하는 두 MessageBox
물론, 분기가 나뉘는 부분에서 점프문or플래그를 패치하면 다음과 같은 창을 볼 수 있긴하다.
좀더 자세히 프로그램이 원하는것을 알아보자.
그런데 여기서 name과 serial값 모두 스택에 넣고 어떠한 주소를 call하는 과정을 거치는것을 발견할 수 있다. 두 곳을 따라가보자
1) name을 스택에 넣고, 호출한 0040137E
1) 0040137E
(Olly의 주석과 함께 보며 이해할것)
esi에 입력한 name을 넣는다.
이후, 401383~40139A의 loop이 있다.
al에 esi=name의 한바이트만 가져와 넣는다. (al은 eax의 마지막2byte)
al이 0인지 확인하고(마지막문자인지 확인하는것) 그렇다면 loop탈출
cmp~jb: al<'A'면 경고창을 띄우고 retn
cmp~jae: al>='Z'면 al에서 0x20을 빼고 loop시작으로(다음글자 반복)
al < 'Z'면 아무것도안하고 그냥 loop시작으로(다음글자 반복)
(여기서 영어 알파벳만을 통과시키는 함수를 만든것같으나, esi가 계속 증가하는 바람에 한글자당 loop이 한번만 돌아 제대로 동작하지않는것으로 추정. 예를들어 b라면 0x20을빼서 B가 되지만, ^의 경우 >로 바뀌고 다음글자로 넘어가버림. 즉 필터링이 제대로 되지않음)
정상적으로 loop을 나왔다면,
모든 문자의 합을 loop을 거쳐 edi에 넣고, edi와 5678을 XOR해 eax에 넣고 리턴한다!
2) serial을 스택에 넣고, 호출한 004013D8
2) 004013D8
역시, eax=edi=ebx=0으로 초기화해주고
esi에 serial을 넣어준후
loop안으로 들어간다. loop을 한줄로 정리하면,
edi = edi X '0xA' + (serial[i] - '0x30')을 반복하는것이다.
이 과정을 통해 16진수로 변환할수있다. (ex. 12->C)
이후 loop을 나와서
edi(16진수로 바꾼 serial)와 1234를 XOR해서 ebx에 넣고 리턴한다!
1), 2)를 거쳐나온후, 각각에서 구한 eax==ebx라면 목표로 분기된다.
sum(all char of name)^5678 = 0x(serial)^1234 이어야하는데, XOR은 2번하면 원복되므로
serial = sum(all char of name)^1234^5678
= sum(all char of name)^444C 로 공식을 만들수있다!
간단히, name을 a로 한다면
a의 hex값인 41과 444c를 XOR시킨 440d를 10진수로 표현하면 17421이다.
이제 name으로 a를, serial로 17421을 입력하면 성공창이 뜬다. 끗
참고자료
[ CMP & JB,JAE... ]
http://baeknamu.com/27
https://m.blog.naver.com/PostView.nhn?blogId=s2kiess&logNo=30181286411&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F
[ ASCII ]
https://ascii.cl/
'Security&Hacking > Reversing' 카테고리의 다른 글
Reversing) abex crackme #3 (0) | 2019.09.11 |
---|---|
Reversing) abex crackme #2 (0) | 2019.09.11 |
Reversing) 기본 C문법 리버싱 (if문, for문) (0) | 2019.09.11 |
Reversing) FSC_Level 1 (0) | 2019.09.11 |
Reversing) abex crackme #1 (0) | 2019.09.11 |
- Total
- Today
- Yesterday
- C
- git
- reversing
- socket
- 우아한 테크코스
- Android Studio
- bfs
- dfs
- Algorithm
- graph
- Vo
- 해외여행
- 개발자
- Android
- FRAGMENT
- queue
- 리버싱
- sort
- brute-force
- OneToMany
- webhacking.kr
- Java
- 회고
- 웹해킹
- Data Structure
- mysql
- Stack
- 프로그래머스
- JPA
- javascript
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |