Bomblab - secret Phase

LONGNEW·2021년 10월 16일
2

Bomb

목록 보기
7/7

폭탄 출처 : Bomb from "Dr.Evil"

no. 1251056

음.. 이런게 있는 줄 몰랐다. 친구가 생일 축하 연락하다가 얘기가 나와서 가르쳐 주고 떠남.. 진짜 폭탄을 던져버림

그 시크릿 페이즈로 가려면 4페이즈에서의 입력이 바껴야 한다.
물론 정답은 두고 바껴야 한다.
마지막 페이즈까지 입력을 받은후에 이전에 입력 받았던 값을 다시 가져와서 확인하니
이를 위한 입력은 원래의 입력 도중에 트리거가 있다.

disas phase_defused를 확인하면서 <+62>쪽의 메모리 값을 확인해보면 될 것 같다.

<+1> callq 0x40156a <read_line>

여기서 시크릿 페이즈의 입력 값을 받아옴 $rax를 확인 해보니 입력한 "문자열"이 저장되어 있었음.

<+19> callq 0x400b90 strtol@plt

이전의 스택 현황이고, strtol?? 처음 보는 함수라 검색해보고 오겠음.

str 관련 함수
strtol : 문자열을 long 값으로 변환 합니다. 2진수, 8진수, 16진수 값을 10진수로 변환 합니다. (string to long)
strtol의 형태
long strtol(const char* , char** , int );
인자의 종류를 알 수 있는데 $rdi에는 char*, $esi에는 0 == NULL, $edx에는 10 즉 기수로 10진수가 들어간다.

옳은 행동을 하지 않은 경우에는 0을 리턴하는 것도 알아두도록 하자.

일단 현재 입력된 값이 "i r"인데 어떻게 변환되는지 보도록 하겠음.
문자가 들어가니 0을 리턴했다.

생각해보니 문자열을 long형태로 변환하는 건데 당연히 숫자가 들어가야 할거 같다.

"10 11"을 넣었더니 10을 리턴했다. 스페이스를 기준으로 끊어버리는 듯 하다.

<+30>: cmp $0x3e8,%eax

일단 strtol의 리턴값 - 1 한 것이 1000보다 같거나 커야 한다.

<+49>: callq 0x4012e2 fun7

fun7 함수에 들어가기 전에 함수의 인자로 입력한 숫자, 그리고 메모리 주소를 넘긴다.

노드 1 ~ 6이 존재하고, n[level][sibling] 이라고 봐야 할지 개수가 왠지는 모르겠지만 그러해 보인다.
마치 트리를 가지고 있는 듯하다.

그리고 n1기준으로 [1], [2] 를 보면 왼쪽, 오른쪽 자식을 찾아가는 것을 확인 할 수 있다.

일단 트리다.


fun 7

<+4>: test %rdi,%rdi

입력 받은 노드의 주소를 비교해서 0, 0인지 확인을 한다. 이 경우에 -1을 리턴해서 폭탄이 터진다.

<+13>: jle 0x4012fe <fun7+28>

%edx에다가 현재 노드의 value를 저장한 후에 본인이 입력한 값과 비교해 노드의 값이 작거나 같은 경우 점프 한다.

<+35>: je 0x40131b <fun7+57>

리턴으로 0을 넣은 후에 노드이 value와 입력값이 동일한 경우 리턴하도록 한다.

원하는 정답은 1을 리턴하는 것이기 때문에 루트 노드를 원하는 것이 아니였다.

왼쪽 자식,

<+15>: mov 0x8(%rdi),%rdi

<+19>: callq 0x4012e2 fun7


<+24>: add %eax,%eax

리턴 값을 2 * eax 한다면 1이 나올 가능성이 없으니까 왼쪽을 찾는 것은 의미가 없어 보인다.


오른쪽 자식,

<+37>: mov 0x10(%rdi),%rdi

<+41>: callq 0x4012e2 fun7


<+46>: lea 0x1(%rax,%rax,1),%eax

리턴으로 0이 왔을 떄 1을 리턴할 수 있는 코드이니까 오른쪽 자식의 노드 값을 줘야 할 것 같다.

secret DONE!!!!!!!!!!!!

0개의 댓글