일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Whois #AjouUniv #정보보안교육 #Pwnable
- AjouUniv #Whois #정보보안교육 #Pwnable
- ftz
- N0NamedWargame #mandu-mandu #forensics #길에서주어온만두
- Allocation Starategy
- Whois #정보보안교육 #webhacking.kr
- webhacking
- Dreamhack
- Memory Virtualization
- AjouUniv #SuniNatas #Web
- python
- Pwnable
- 운영체제
- AjouUniv #Whois #정보보안교육
- hackerschool
- N0Named
- Whois #정보보안교육 #AjouUniv #Pwnable
- 코딩도장
- 사이버보안학과
- AjouUniv #Whois #Reversing
- 스케줄링
- Variable Partition
- N0NamedWargame #mandu-mandu #forensics #left_side_B
- HackCTF
- Whois #정보보안교육 #Ajou
- systemhacking
- 아주대학교
- SuNiNaTaS #mandu-mandu #AjouUniv #forensics
- 아주대학교 #Whois #정보보안교육 #4주차
- N0NamedWargame #AjouUniv #mandu-mandu #forensics
- Today
- Total
chipkkang9's story
[Whois 정보보안교육] EasyReverseMe 문제풀이 본문
준비물
x64dbg.exe
x64dbg
Built on open-source libraries x64dbg uses Qt, TitanEngine, Zydis, Yara, Scylla, Jansson, lz4, XEDParse, asmjit and snowman.
x64dbg.com
문제소개
문제풀이
정보보안교육 5주차 두 번째 과제 문제는
EasyReverseMe라는 회장님 자작문제이다.
문제 파일을 다운받고 x64dbg 디버거에 넣어 실행시키면
문제소개와 같은 화면이 나오게 된다.
프로그램을 실행시키고 디버거에서 F9를 통해서 실행시키다 보면3~4번 동작 후에 첫 번째 문구가 생기는 것을 알 수 있다.
"전 1부터 100까지의 하나의 수를 생각하고 있어요 뭐게요?"
음... 회장님의 음성지원이 되는 듯하다.
당연히 1부터 100중에 무작위로 대입하라는 뜻은 아닐 것이다.
x64dbg를 보자.
문자열을 출력하는 call <JMP.&puts> 뒤에 등장하는
call <JMP.&scanf>로 무엇인가를 입력받은 후,
cmp를 통해 값을 비교하여
jne(jump not equal)로 해당 값이 맞는지 아닌지를 판별한다.
힌트를 보아하니, 'I'가 힌트인 듯하다.
I는 아스키코드 값으로 73이기 때문에 73을 입력해주자.
73을 입력해주니 맞다는 문구와 함께 다음 물음이 등장한다.
"저는 지금 무슨 생각을 하고 있을까요?"
음... 솔직히 문구를 보고 대충 배고프지 않을까? 라는 생각을 했었다.
이게 맞을거라고는 상상도 못했다.
아무튼 역시 아까와 같은 방법으로 디버거를 내리다보면,
와 같은 어셈블리 코드를 확인할 수 있다.
I'm so hungry를 입력해주는 것을 원하는 것 같으니
그렇게 해주도록 했다.
이번에는 난수생성을 맞춰보라는 문제인 듯 하다.
아무래도 디버거에는 16진수로 작성되어 있고 회장님께선 답을 10진수로 받고싶으신 것 같다.
코드를 한 번 더 읽어보자.
코드를 천천히 읽어보면,
call <JMP.&rand>를 통해서 생성된 난수의 값을
rbp-8의 주소에 저장한다.
그리고 해당 코드보다 7줄 아래에 있는
call <JMP.&scanf>로 입력받는 값과
cmp를 통해 값을 비교한 후,
je(jump equal)을 통해 값이 맞는지 아닌지를 판별한다.
그러면 중요한 것은 난수가 생성된 이후에
rbp보다 8개의 주소 이전에 어떤 값이 저장되어 있는지를 확인해봐야 한다.
해당 주소에 어떤 값이 스택에 저장되어 있는지를 확인하기 이전에
RIP의 설정이 올바르게 되었는지를 확인해보아야한다.
RIP는 현재 가리키는 코드를 실행한다는 것을 의미하므로,
웬만하면 RIP가 난수생성 코드 이후에 오도록 위치시켜준 후에 스택을 살펴보자.
RBP가 가리키는 주소값은 000000000062FE20이다.
이를 우클릭 > 스택에서 따라가기를 클릭하여 스택을 찾아보면,
위와 같은 화면이 나오게 된다.
RBP의 주소로 가리키는 스택은 회색으로 칠해진 부분과 같다.
하지만, 우리가 관심이 있는건 RBP 주소보다 8칸 앞에 있는
000000000062FE18 이다.(16진수로 생각하면 왜 그런지 알 수 있다.)
(여기부턴 난수기 때문에 실행마다 다르다.)
그에 초점을 맞추면
해당 주소의 스택에 저장되어있는 값이 2166인 것을 알 수 있다.
2166은 16진수 값이기 때문에 이를 10진수로 변환해주면,
10진수로 '8550'이 나오고 이를 입력해주면 해결된다.
'CTF > Reversing' 카테고리의 다른 글
[Reversing.kr] Easy Crack 문제 write-up (0) | 2022.02.07 |
---|---|
[Whois 정보보안교육] RootMe PE x86 - 0 protection 풀이 (0) | 2021.11.08 |