해보자고

[드림핵] simple-operation 본문

리버싱

[드림핵] simple-operation

초코맛동산 2024. 5. 13. 12:39

# 문제

문제 링크 | https://dreamhack.io/wargame/challenges/836

 

simple-operation

Description 우리의 친구 아모가 미션을 주었습니다. "내가 원하는 결과가 나오도록 값을 입력해 줘!" 주어진 바이너리를 분석하고 알맞은 값을 입력하면 플래그가 출력됩니다. 플래그는 flag 파일에

dreamhack.io

우리의 친구 아모가 미션을 주었습니다. "내가 원하는 결과가 나오도록 값을 입력해 줘!"
주어진 바이너리를 분석하고 알맞은 값을 입력하면 플래그가 출력됩니다. 플래그는 flag 파일에 있습니다.

 

1. main 함수 찾기 

해당 문제의 파일은 PEfile이 아닌 관계로 따로 xdbg로 main을 찾지는 않았고, IDA freeware의 그래프뷰로 쉽게 main 함수를 찾을 수 있었다. 

 

 

2. 실행 흐름 파악하기

 

쉽게 주석을 달아 함수 혹은 변수를 변경해 주었다. 하나씩 단계를 나눠서 살펴보자면..

 

2.1 변수 초기화 & fd 읽고 닫기 

 

위의 디컴파일 코드는 각 변수들을 선언, 초기화하고 있는 것을 볼 수 있다.

 

 

해당 코드 역시 같은 위치의 ./flag 파일을 파일포인터로 열고 읽고 닫고 있다. 

 

 

2.2 get_rand_num() : random 숫자를 가져오는 함수.

 

 

open() 은 파일을 열거나 생성 후 열어주는 함수로 /dev/urandom 파일을 열고 있는데 해당 파일은 유닉스 계열에서의 난수생하는 특수 파일이라고 한다. 해당 난수는 buffer_for_randnum에 저장되고 exit 한다. 

 

 

2.3 input 받기 & 분기문 

 

이후 사용자의 입력을 scanf를 통해서 10진수로 받고, random 값과 입력받은 input 을 비트단위의 xor 연산해 v11에 저장하고 있다. 딱히 v11변수를 이후에 활용하지는 않아서 바로 다음 코드를 살펴보면 snprintf() 를 사용한다. 

 

주석에도 써두었 듯 인자를 총 4개를 받고 있는데 s는 문자열이 저장될 버퍼, 9uLL은 unsigned longlong 타입으로 9바이트의 버퍼 크기를 설정해주고, 문자열 포맷을 08x로 두고 random값과 input값을 xor 연산한다.

=> 쉽게 random xor input 값이 s에 저장된다. 

 

 

그리고 for문을 통해 s1 배열은 s 배열을 뒤집어서 저장하고 있다. 그런데 이 s1을 a0b4c1d7과 비교해서 분기함으로(같으면 Congrats!, 다르면 Try again) s는(buffer_for_random xor input) = 7dc14b0a가 되어야 한다.  

 

 

3. 문제 풀기

 


netcat을 설치해주고 문제 포트를 입력하여 문제를 풀어주면... flag를 얻을 수 있다. 

5c6fcaa9 xor 7d1c4b0a -> 561217955(10진수) 

 

 

 

 

'리버싱' 카테고리의 다른 글

[드림핵] Secure Mail  (0) 2024.11.14
[드림핵] rev-basic-8  (0) 2024.08.31
[드림핵] rev-basic-6  (0) 2024.05.06
[리버싱] rev-basic-4  (0) 2024.04.28
[드림핵]rev-basic-3  (0) 2024.04.27