문제
이 문제는 사용자에게 문자열 입력을 받아
정해진 방법으로 입력값을 검증하여
correct 또는 wrong을 출력하는 프로그램이 주어집니다.
해당 바이너리를 분석하여 correct를 출력하는 입력값을 알아내세요.
풀이과정
분석함수인 7FF ~ 1000 으로 들어가서
6번은 어떤 코드를 작성해야 하는 문제인지 알아보도록 한다.
ret까지의 코드들의 큰 흐름을 살펴보니,
7FF~3020 주소에 저장된 문자열을 str, 7FF~3000 주소에 저장된 문자열을 buff라고 하고
사용자가 입력하는 문자열을 input이라고 한다면
str의 input[i]번째 문자 = buff의 i번째 문자가 되도록 하는 input값을 찾아내야 하는 것 같다.
그니까 내가 입력한 input이라는 문자열의 i번째 문자가 특정한 값 (num)을 가질텐데,
str의 num번째 문자 == buff의 i번째 문자가 되어야
i <18일 때 ret으로 넘어가지 않고 쭉 이어질 수 있다.
str이 어떻게 저장되어 있는지 보자
스터디할 때 여기 제대로 이해 못 하고 가서 어설프게 아는 척 했다가...멸망티비...
str의 num번째 문자 == buff의 i번째 문자, 즉 num은 16진수로 표현 가능해야 한다.
num = input[i]이므로, 사용자가 입력한 어떠한 문자일텐데
문자는 0x00 ~ 0x7F까지의 hex값을 가질 수 있다.
어쨌든 컴퓨터가 문자를 인식할 때에는 아스키코드로 읽을텐데, 아스키코드의 hex값은 0x00 ~ 0x7F까지이기 때문
따라서 0x00 <= num <= 0x7F
str의 num번째 문자 == buff의 i번째 문자여야 하니까
일단 num의 범위인 0부터 127까지, 즉 128개의 문자들을 str의 num번째 문자 후보군으로 뽑아 넣는다.
그래서 위의 덤프에서 0x63부터 0xD2까지를 str[num] 후보군으로 설정하기
플래그 : Replac3_the_w0rld
'étude > reverse engineering' 카테고리의 다른 글
[어셈블리어] shift / ROL, ROR (2) | 2023.12.03 |
---|---|
dreamhack : rev-basic-5 (0) | 2023.11.05 |
dreamhack : rev_basic_7 (0) | 2023.11.04 |
dreamhack : rev_basic_3 (0) | 2023.08.06 |
dreamhack : rev_basic_2 (0) | 2023.08.05 |