Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

D1N0's hacking blog

01_angr_avoid 본문

Reversing/angr_ctf

01_angr_avoid

D1N0 2021. 2. 26. 11:19

지난 글을 보지 않았다면 먼저 보고 오자

 

00_angr_find

들어가기 전에 이 글은 angr에 대해 배운 내용을 정리하는 글이다 C와 파이썬, 간단한 리버싱 지식을 기본 전제로 하고 있다 모든 문제는 github.com/jakespringer/angr_ctf를 바탕으로 하였고, 바이너리 파

d1n0.tistory.com

시작

이번에 알아볼 것은 프로그램 실행 중에 피할 주소를 설정하는 방법이다

일단 angr_ctf의 01번 문제를 보며 알아보자

파일을 보면 00번과 비교해볼 때 유독 크기가 큰 것을 알 수 있다

 

아니나 다를까 기드라가 디컴파일을 실패했다

그러므로 우리는 간단한 흐름만 살펴보겠다

함수를 보면 눈에 띄는 게 있다

maybe_good은 실행해야 하는 함수, avoid_me는 실행하면 안 되는 함수처럼 보인다

void maybe_good(char *param_1,char *param_2)

{
  int iVar1;
  
  if ((should_succeed != '\0') && (iVar1 = strncmp(param_1,param_2,8), iVar1 == 0)) {
    puts("Good Job.");
    return;
  }
  puts("Try again.");
  return;
}
void avoid_me(void)

{
  should_succeed = 0;
  return;
}

실제로 avoid_me가 실행되면 maybe_good에서 조건을 통과하지 못하는 것을 볼 수 있다

 

저번에 우리는 explore함수를 실행할 때 find 인자를 통해 함수가 갔으면 하는 주소를 넣었다

이와 비슷하게 avoid 임자를 통해 함수가 가지 않았으면 하는 주소를 지정할 수 있다

 

scaffold01.py을 보며 자세히 알아보겠다

import angr
import sys

def main(argv):
  path_to_binary = ???
  project = angr.Project(path_to_binary)
  initial_state = project.factory.entry_state()
  simulation = project.factory.simgr(initial_state)

  print_good_address = ???
  will_not_succeed_address = ???
  simulation.explore(find=print_good_address, avoid=will_not_succeed_address)

  if simulation.found:
    solution_state = simulation.found[0]
    print solution_state.posix.dumps(sys.stdin.fileno())
  else:
    raise Exception('Could not find the solution')

if __name__ == '__main__':
  main(sys.argv)
import angr
import sys

def main(argv):
  path_to_binary = ???
  project = angr.Project(path_to_binary)
  initial_state = project.factory.entry_state()
  simulation = project.factory.simgr(initial_state)

이부분은 저번에도 봤다

파일 위치를 받아서 angr에서 사용할 수 있도록 불러오고, 초기 상태를 entry_point로 지정하고, 시뮬레이션 관리자를 만들었다

??? 에는 똑같이 argv[1]을 넣으면 된다

print_good_address = ???
will_not_succeed_address = ???
simulation.explore(find=print_good_address, avoid=will_not_succeed_address)

이 부분이 핵심이다

전에 simgr의 find 인자로 프로그램이 갔으면 하는 주소를 적었다

이와 비슷하게 avoid인자를 사용하면 프로그램이 가지 않았으면 하는 주소를 적을 수 있다

코드를 보면 find 인자에 print_good_address, avoid 인자에 will_not_succeed_address를 넣고 있으니

print_good_address에는 Good Job을 출력하는 부분의 주소를, will_not_succeed_address에는 avoid_me의 주소를 넣으면 된다

  if simulation.found:
    solution_state = simulation.found[0]
    print solution_state.posix.dumps(sys.stdin.fileno())
  else:
    raise Exception('Could not find the solution')

if __name__ == '__main__':
  main(sys.argv)

나머지 부분은 전과 다르지 않다

전처럼 print에 괄호를 추가하기만 하면 된다

 

최종 코드는 다음과 같다

import angr
import sys

def main(argv):
  path_to_binary = argv[1]
  project = angr.Project(path_to_binary)
  initial_state = project.factory.entry_state()
  simulation = project.factory.simgr(initial_state)

  print_good_address = 0x080485dd
  will_not_succeed_address = 0x080485a8
  simulation.explore(find=print_good_address, avoid=will_not_succeed_address)

  if simulation.found:
    solution_state = simulation.found[0]
    print(solution_state.posix.dumps(sys.stdin.fileno()))
  else:
    raise Exception('Could not find the solution')

if __name__ == '__main__':
  main(sys.argv)

HUJOZMYS가 나왔고, Good Job이 잘 뜨는 것을 확인할 수 있다

 

지금까지 angr의 simgr에서 피하고 싶은 주소를 찾는 방법을 알아봤다

저번 글과 별반 차이가 없어서 어렵지 않았을 것이라 생각한다

하지만 코드를 짜다보면 find와 avoid에 굳이 함수를 찾아서 주소를 직접 넣어야 하는 게 귀찮았을 것이다

그래서 다음번에는 find와 avoid를 사용할 때 함수의 주소를 직접 찾아서 넣지 않아도 되는 방법을 알아보겠다

'Reversing > angr_ctf' 카테고리의 다른 글

04_angr_symbolic_stack  (0) 2021.04.10
03_angr_symbolic_registers  (0) 2021.03.26
02_angr_find_condition  (0) 2021.02.26
00_angr_find  (0) 2021.02.24
Comments