rev-basic-1 풀이정리

Evie·2023년 9월 18일
0

시스템

목록 보기
18/22

🤓 dreamhack Exercise: rev-baisc-1

🔎프로그램 실행

신뢰할 수 없는 프로그램을 분석헐 때는 악성 프로그램일 가능성을 대비하여 정적 분석을 먼저 시도해 보는 것이 바람직하다고 합니다.
근데 저는 문제 파일 다운 받자마자 냅다 실행시켜봤어요 ...
반성 하겠습니다...

심지어 그냥 실행하면 삑 없어지길래
cmd창에 손수 입력해서 실행해봄
어쨌든 input값을 넣으면 결과를 반환하는 프로그램이네요
알맞은 값을 찾아내야겠죠?

🔎Main 함수 분석

정적 분석을 위해 IDA Freeware로 프로그램을 열어주면 자동으로 main함수를 찾아줍니다. 컴파일러별로 main함수를 호출하는 패턴이 일정하기 때문에 이런일이 가능하다고 하네요!

이 메인 함수를 F5로 디컴파일 해보면

이렇게 결과가 나옵니다!
1. v4라는 256바이트의 char 배열을 0으로 초기화
2. 내부 함수 2개를 호출
3. v4 배열을 입력값 검사합수에 전달해 반환 값이 있다면 correct, 없다면 wrong을 출력

내부 함수 2개를 거치고 입력값 검사 함수를 통해 correct와 wrong을 출력하는 프로그램이네요!
3개의 내부 함수를 하나씩 디컴파일해서 확인해 봅시다!

내부 함수 1


첫번째 내부함수를 더블클릭해서 탐색하면 이렇게 나옵니다!
이전 실습에서 분석한 pritf함수와 구조와 굉장히 유사하네요

iob func로 1번에 해당하는 stdout 파일 스트림을 가져옵니다.

표준 스트림
: 운영체제에서 기본적으로 제공하는 추상화된 입출력 장치
컴퓨터 프로그램과 그 환경 (키보드, 화면 등) 사이에 미리 연결된 입출력 통로

  • STDIN(표준입력) : 아이디는 0, 일반적으로 키보드
  • STDOUT(표준출력) : 아이디는 1, 일반적으로 콘솔이나 터미널
  • STDERR(표준에러) : 아이디는 2, 일반적으로 표준 출력과 동일

stdout 파일 스트림을 가져온 iob func 내부를 살펴보면 stdio_common_vfprintf 함수를 호출합니다. 여기서 이 함수가 pritf 라는 것을 추측할 수 있습니다.

그래서 함수 이름도 printf로 변경해줍니다.
더 깔끔하게 분석할 수 있다고 합니다.

내부함수 2


두번째 내부함수도 비슷한 구조를 가지고 있는데 이번에는 0번의 STDIN 파일 스트림을 가져옵니다.
또 내부 함수를 살펴보면, stdio_common_vfscanf함수를 호출하고 있는 것을 확인 할 수 있고 여기서 scanf함수라는 것을 추측했습니다!

더 깔끔한 분석을 위해 이 함수의 이름도 scanf함수로 바꾸어 줍시다!
이런 함수의 패턴들을 익혀두면 더 빠른 분석이 가능합니다!

내부함수 3 - 입력값 검증


입력값을 검증하는 함수를 분석해보면 해당 함수가 1을 리턴해야 correct를 출력하게 됩니다.
a1은 우리가 입력한 값이고 1바이트 단위로 값을 비교하는데, 정해진 값과 다르면 0을 리턴하게 됩니다.
마지막 값까지 모두 일치한다면 1을 리턴합니다!
그럼 이 정해진 값들이 무엇인지 알아내면 되겠죠?


R를 누르면 int 값을 Char로 변환할 수 있는 기능을 제공합니다!
모두 아스키 코드로 변환하고 이를 이어붙이면 우리가 입력해야하는 플래그 값이 나오겠죠!
문자열 끝에 비교하는 0은 문자열의 끝인 NULL을 의미하기 때문에 자동으로 들어가가게 됩니다!4

🔎 플래그 값 검증


이렇게 알아낸 플래그를 입력해주면
Correct!!

표준 입출력도 다시 한 번 짚고 넘어가고
아스키 변환 기능도 알 수 있었다!

profile
공부합시다

0개의 댓글