본문 바로가기
étude/reverse engineering

dreamhack : rev-basic-6

by mummoo 2023. 11. 5.

문제

이 문제는 사용자에게 문자열 입력을 받아

정해진 방법으로 입력값을 검증하여

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