틀린 부분이 있다면 언제든지 댓글 남겨주세요!
x64dbg에서 기본 사용법 및 main함수 찾기, easy_crackme1.exe 파일 분석
기본 사용법
- 따라가기 기능
- call, jmp, jcc와 같은 PC변경 명령어는 [enter] 키를 이용하여 이동
- mov, lea와 같은 주소 참조 명령어는 해당 주소 > 오른쪽 마우스 > 디스어셈블러에서 따라가기 혹은 덤프에서 따라가기 - 레이블 및 주석 달기
- 레이블 :함수나 변수, 즉 해당 주소에 이름을 붙임 [:] 키를 이용하여 지정
- 주석 :해당 주소에 설명을 붙임 [;] 키를 이용하여 지정 - 그래프로 보기
- 보고자 하는 함수에서 오른쪽 마우스 > 그래프 보기 혹은 [g] 키
- 빠져나갈 땐 오른쪽 마우스 > Follow in Disassembler
* 초록색 선: jcc명령어에서 분기를 취했을 때 가는 노드
빨간색 선: jcc명령어에서 분기를 취하지 않았을 때 가는 노드
파란색 선: 항상 분기를 취하는 노드
- Fx 아이콘 :분석된 함수들 모음
함수 분석 =해당 함수 오른쪽 마우스 > 분석 > 모듈분석 (ctrl + A)
main 함수 찾는 방법
- Az 아이콘 :모듈내 문자열을 참조하는 어셈블리어 검색
해당 문자열을 참조하는 어셈블리어의 주소와 내용을 알려줌
hello world 문자열을 참조하는 부분을 더블클릭하면 main 함수로 이동
- 핸드폰 모양 아이콘 :모듈간 함수 호출
puts 함수를 호출하는 부분을 더블클릭하면 main 함수로 이동
* TCP 패킷을 처리하는 함수
- windows =WSARecv
- Linux =recv, recvfrom
* PDF를 처리하는 함수
- PDF의 시그니처인 %PDF 검색
- windows =ReadFile
- Linux =read와 같이 파일을 읽어오는 함수 호출 부분 찾기
분석 순서
easy_crackme1.exe파일
프로그램에 로드 > 모듈 분석 > main 함수 찾기 > main함수 분석 > 입력받은 데이터를 처리하는 함수로 추측되는 sub_140001180함수 분석 > 분석한 내용을 바탕으로 답을 구하기 위한 코드 작성
sub_140001180 함수 분석 ↓
각 노드를 확인해본 결과 correct로 가려면 eax가 1이어야 함. (eax=1 > ZF=0 > je명령어를 통해 main 함수 그래프에서 빨간 선으로 표시된 노드로 감) 즉 correct 결과를 출력하려면 sub_140001180함수에서 eax값을 1로 만들어줘야 하므로 easy_crackme1.~11E8 노드로 가야 함.
correct 노드로 가기 위한 조건을 정리해보면
- [rsp+20] (=ecx) 가 2000보다 작거나 같고, [rsp+28] (=edx)가 2000보다 작거나 같아야 함.
- [rsp] = [rsp+20] * [rsp+28] = 6ae9bc 이어야 함.
- [rsp+4] = [rsp+20] / [rsp+28] = 4 이어야 함.
- [rsp+8] = [rsp+20] ^ [rsp+28] = 12fc 이어야 함.
// 비효율적인 코드인듯.. XOR의 특징을 이용해서 좀 더 효율적인 코드를 작성할 수 있다고 한다 > 수정 예정!
// 답은 5678 1234
for i in range(0x2000 +1):
for j in range(0x2000+1):
if i*j == 0x6ae9bc:
if i//j==4:
if i^j==0x12fc:
print(i,j)
참고: dreamhack의 리버싱 강의
'Security > Reversing' 카테고리의 다른 글
PEB TEB (0) | 2021.02.02 |
---|---|
Abex crackme #2 / ollydbg 단축키 (0) | 2021.01.25 |
Reversing Basic Challenge #1 (0) | 2020.12.20 |
Reversing Basic Challenge #0 (0) | 2020.12.19 |
레지스터 명령어 (0) | 2020.12.01 |
댓글