dreamhack : rev-basic-1 write-up
실습을 통해 이해하기
https://dreamhack.io/wargame/challenges/15/
rev-basic-1
Reversing Basic Challenge #1 이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다. 해당 바이너리를 분석하여 correct를 출
dreamhack.io
step1. main 함수 분석
디컴파일(F5)
1. v4라는 256바이트의 char배열을 0으로 초기화
2. sub_1400013E0 함수와 sub_140001440 함수를 호출. 이때 인자로 각각 "Input: " , "%256s"문자열이 들어감
3. v4 배열을 sub_140001000 함수의 인자로 전달해 반환값이 있다면 "Correct"를, 아니라면 "Wrong" 문자열을 출력
step2. 각 함수 내부 분석
1. sub_1400013E0 함수 = printf( )
2. sub_1400012B0 함수
3. sub_140001440 함수
_art_iob_func( ) 를 통해 가져오는 파일 스트림이 0번 -> stdin 파일 스트림 = 표준 입력을 사용하는 함수 = scanf( )
4. sub_140001300
step2. main 흐름 파악
input: 이라는 문자열을 화면에 출력
256바이트의 문자열을 v4 변수에 입력받음
Correct와 Wrong 중 출력할 문자열 결정
Step3. 입력값 검사 함수 분석 -> sub_140001000 함수 분석
a1은 입력한 값(1바이트 단위로 값 비교)
조건문 중에서 문자열의 각 인덱스 별로 정해진 숫자와 다르면 0을 리턴하고, 마지막 조건이 입력값의 21번째 인덱스가 0 이면 1을 리턴.
입력해야 하는 문자열의 각 인덱스 값이 정해져 있고 정해진 값과 모두 일치하면 "Correct"출력.
IDA에서 숫자를 무자로 변환하는 단축키 = r
변환 후
모두 아스키 코드로 변환하고 이를 이어붙이면 우리가 입력해야 하는 입력값이 될듯.
문자열의 끝은 NULL문자로 0을 의미(입력 ㄴㄴ)
💡쓸만한 단축키
이름 재설정 : n
숫자->문자 아스키 변환 : r