D1N0's hacking blog
01_angr_avoid 본문
지난 글을 보지 않았다면 먼저 보고 오자
시작
이번에 알아볼 것은 프로그램 실행 중에 피할 주소를 설정하는 방법이다
일단 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 |