http://reversing.kr/challenge.php
<X32 dbg 사용>
해당 exe 파일을 실행시켜서 “ABCDEFGHIJK”라는 랜덤 문자를 넣어봤더니 “Incorrect Password”라는 문구가 출력된다.
파일을 x32dbg로 열어서 보니, 문자열 찾기를 통해 정답을 비교해주는 듯한 부분을 찾을 수 있었다.
위의 문자들 중 Congratulation !! 부분을 클릭해서 들어가 보면 아래의 그림과 같이 main 함수를 찾을 수 있다.
보기 쉽게 그래프모드로 확인해보면 아래의 그림과 같다.
< 미리 예측할 수 있는 부분 >
: 중간중간 주석으로 a, R3versing, E 와 같은 문자들이 있는 것으로 보아, 이 문자들을 비교하는 과정임을 예측할 수 있고,
해당 문자들을 조합한 것이 답일 것이라고 예측할 수 있음
<1번 노드>
조금 더 확실하게 보기 위해서 일단 1번 노드의 아래 cmp 부분에 BP를 걸고 F8를 눌러 한 줄씩 실행해보았다.
쭉 내려오다가 cmp 부분에서 위의 그림의 동그라미 안을 확인해보면, 입력한 글자 중에 B가 저장되는 위치(esp+5)와 0X61(a)를 비교하고 있다. 따라서 두번째 글자가 a라는 것은 쉽게 예측할 수 있다.
이제 두번째 노드의 jne에 BP를 걸고, 두 번째 글자를 a로 바꿔 다시 실행시켜보겠다.
<2번 노드>
이번에는 AaBCDEFGHIJK라는 문자를 입력해서 실행시켜보았다.
두 번째 노드를 보면, 마지막에 test를 한 후, incorrect password로 점프하도록 되어있다.
정답을 알기 위해서는 점프가 취해지면 안 되고, 3번 노드로 진행해야 한다.
Jne는 같지 않으면 jump, 즉 ZF가 0일때, 다시 말해서 연산의 결과가 0이 아닐 때 점프한다.
정리하자면 점프하지 않기 위해서는 결과가 0이어야 한다.
Test는 두 operand를 and 연산하며, and 연산은 1&1일 때만 결과가 1이 나오고 둘 중 하나에 0이 포함되어 있어야 결과가 0이 나온다.
말이 길어졌지만 결국 eax에 0이 포함되어 있어야 한다는 뜻이다.
2번노드를 보았을 때, call 함수를 통해 불려지는 401150에서 eax가 0이 되어야 한다고 예측할 수 있다.
그리고 함수 호출 전에 ecx에 input의 3번째 글자부터 끝까지가 들어가 있음을 확인할 수 있다.
그런데 굳이 call 함수를 보지 않아도 예측할 수 있는데,
BP를 걸고 실행하다보면, push를 통해 2만큼 공간을 만들고, ecx에 [esp+A](“BCDEFGHIJK”가 들어간다고 되어있음)를 넣고, easy_crackme.406078을 가져오는 것으로 보아, “BCDEFGHIJK”에서 두 글자를 easy_crackme.406078와 비교하라는 것으로 예측할 수 있다.
easy_crackme.406078를 덤프해서 따라가면 “5y”라는 문자를 볼 수 있고, 다시 말해서 input의 3,4번째 글자에는 5y가 와야 한다는 것을 알 수 있다.
<3번 노드>
이번에는 입력값을 “Aa5yBCDEFGHI” 로 변경하고 2번째 노드의 jne에 BP를 걸어보았다.
2번째 노드를 잘 거쳐서 세번째 노드로 내려오면, 40606C에 “R3versing”이라는 문구가 저장되어 있고, 이것을 esi에 저장한다고 되어있다.
그리고 lea를 보면, [esp+10]의 4byte를 eax에 저장하고 있다. 현재 [esp+10]에는 input의 다섯 번째 글자부터 끝까지 들어가 있다.
결국 5번째 글자부터는 R3versing과 한 글자씩 비교하는 것임을 예측할 수 있다.
흐름을 보면 4-5-6-8번 노드가 반복문 형식임을 알 수 있다.
그러나 첫번째 글자가 맞으면 두 번째 글자를 비교하는 것이 한 분기인 것은 조금 독특하다고 생각한다. (개인적으로,,)
<4번 – 5번 – 6번 – 8번>
3번노드에서 [esp+10]으로부터 1byte를 가져와서 이를 dl에 저장하고, 또 R3versing으로부터 1byte를 가져와서 bl에 저장하고, 둘을 비교한다.
Dl과 bl이 동일하면 한번 더 test를 하고, [esp+10]의 두번째 글자를 다시 dl에 저장, R3versing의 두 번째 글자를 다시 bl에 저장해서 비교하는 형식으로 반복문을 진행한다.
그리고 8번 노드에서는 앞에서 2글자를 비교했으므로, eax와 esi에 각각 2씩 더해서 다다음 문자부터 똑같이 비교하는 형식으로 진행한다.
이를 통해 input의 5번째 문자부터 끝까지는 R3versing이 됨을 알 수 있다.
<11번 노드>
지금까지 Aa5yR3versing이라는 문자열이 완성되었다.
아직 첫 번째 글자가 정해지지 않았는데, 이는 11번 노드를 보면 [esp+4]와 0x45(E)를 비교하고 있음을 볼 수 있다.
앞에 1번 노드에서 두 번째 글자가 저장되어 있던 위치가 ESP+5 임을 보면, ESP+4는 첫 번째 글자임을 알 수 있고, 결과적으로 Ea5yR3versing이라는 문자를 찾을 수 있다.
'Reversing > Reversing.kr' 카테고리의 다른 글
[Reversing.Kr] Auto Hot Key1 풀이 (0) | 2021.07.31 |
---|---|
[Reversing.Kr] C SHOP 풀이 (0) | 2021.07.31 |
[Reversing.Kr] Easy Unpack 풀이 (0) | 2021.07.31 |
[Reversing.Kr] ransomware 풀이 (0) | 2021.07.26 |
[Reversing.Kr] Easy ELF 풀이 (0) | 2021.07.26 |