일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 라업
- hackingcamp
- Basic
- reversing.kr
- write up
- PYTHON
- ShaktiCTF
- 드림핵
- 코드엔진
- 워 게임
- probgame
- 뭉뭉
- 2021
- 변수
- 리버싱
- 시탭
- 라이트업
- vsCode
- write-up
- 라이트 업
- 히공
- 풀이
- web
- ctf
- c언어
- 리버스 엔지니어링
- 파이썬
- reversing
- 해킹캠프
- 강의
히공
reversing.kr - x64 Lotto 본문
로또 문제를 풀어보겠습니다.
실행화면 입니다.
메인함수입니다.
64비트 문제여서 그런지 wprintf, wscanf_s 등 w붙은 함수를 사용하네요.
x64dbg의 주석기능을 이용해서 코드의 설명을 넣었습니다.
wscanf_s 부분에 bp를 걸고 f9를 입력해서 숫자를 입력해보겠습니다.
1 2 3 4 5 6을 입력했습니다.
그 후 system("cls")로 창을 이쁘게 정리해주고, sleep(0x1f4)를 해서 조금 쉬게 해줍니다.
여기서 랜덤으로 값을 가져오고, 그 값을 암호화 합니다.
그 후 [rsp+rbx*4+0x54] 부분에 순서대로 값을 저장합니다.
이것을 총 6번 반복합니다.
그 후 생긴 배열입니다.
이런 루틴이 있습니다. 총 6번 for문을 돌립니다.
비교 루틴이 보입니다.
eax값은 1이고, [rsp+rcx+0x58]의 값은 0x10 입니다.
eax는 제가 wscanf_s로 입력한 것이 들어가고, [rsp+rcx+0x58]은 아까 총 6번 for문 돌리고 생긴 배열에서 값이 들어갑니다.
생각을 해보면 제가 진짜 로또를 당첨할 수 있는 운이 없다면 입력만 해서 문제를 풀 수는 없습니다.
제가 입력 후 로또 번호를 만들기 때문입니다. (랜덤으로)
그러면 저기 jne를 nop으로 바꿔주어 아무 역할도 하지 않게 한다면 문제를 풀 수 있습니다.
변경했습니다. (이제 여기 bp는 제거해주세요.)
그리고
함수를 끝내는 부분으로 와서 bp를 걸어주세요. (안걸고 f9로 실행하면 프로그램이 바로 꺼집니다.)
간단한 패치로 풀 수 있는 문제였습니다.
정답 : from_GHL2_-_!
'reverse engineering > reversing.kr' 카테고리의 다른 글
reversing.kr - Position (0) | 2020.12.22 |
---|---|
reversing.kr - ImagePrc (0) | 2020.12.10 |
reversing.kr - Ransomeware (6) | 2020.11.22 |
reversing.kr - Easy ELF (0) | 2020.11.12 |
reversing.kr - Easy Keygen (0) | 2020.09.14 |