phase_3 disassemble
전체 코드이다. 점점 길어진다...
우선 나는 임의로 숫자 4와 56을 입력했다.
4를 보면 함수에 파라미터로 주기 위한 부분인 rdi에 무언가 들어가는 것을 볼 수 있다. 해당 주소에 있는 값을 보면
이렇다. 이 값이 __isoc99_sscanf@plt에 들어간다는 것을 알 수 있고, 원하는 값은 정수 2개라는 것도 추측할 수 있다.
위 함수가 호출된 후 eax에는 입력받은 숫자의 갯수가 들어간다.
jg는 앞에 수가 뒤에 수보다 작을 때 분기한다. 즉 eax에 있는 값이 1보다 커야한다는 것을 알 수있다. 우리는 어차피 2개의 숫자를 입력할 것이기 때문에 자연스럽게 넘어가자
39번을 보면 0x8(rsp)에 있는 값과 7을 비교하여, 7이 작으면 106번으로 분기하는 것을 볼 수 있다. 106번은 폭탄이다. 따라서 저기에 있는 값은 7보다 작거나 같아야한다.
해당 위치에 있는 숫자를 꺼내보니 4가 나왔다. 즉 저기에는 첫번째로 입력한 수가 들어간다는 것을 알 수있다.
-> 첫 수는 7보다 작거나 같아야한다.
그 다음 첫번째로 입력받은 값을 eax에 넣는다.
이후 어떠한 주소를 계산해서 그 주소 안에 있는 값으로 jump한다.
기억 안날 것 같아서 써두었다.
저대로 하면 8 * rax값 + 0x402470에 주소값을 계산하면 된다.
지금 rax에 4가 있으니까 이를 계산하면 0x402490이다.(16진수니까)
이 속에 있는 값을 보면
주소가 하나 나오는 것을 볼 수있다.
그 주소로 가보자
사실 ni를 사용해서 이동하면서 disas 하다보면 저절로 +78로 분기한다.
위에 내용을 이해하고 원리를 알면 좋지만, 모르겠으면 그냥 따라가도 좋다
eax에 0x185를 넣고 123으로 분기하는 것을 볼 수 있다.
그 다음 0xc(%rsp)값과 eax값을 비교한다.
0xc(%rsp)는 두 번째 입력한 값인 것 같지만 그래도 확인해보자
맞다.
아까 우리는 eax에 0x185를 넣었다. 이 값은 10진수로 389이다. 그럼 첫번째 수가 4이면 두번째 수는 389라는 것을 알 수 있다.
참고!
여기서 rax의 값을 확인해보면
이런게 뜬다. 이건 eax에 해당 숫자의 주소값이 아닌 그 숫자 자체가 들어있기 때문이다.
그래서 이를 확인하려면 i r 명령어로 전체 레지스터 값을 확인하면 된다.
여길 보면 rax에
389가 들어있는 것을 볼 수 있다.
정답
우리가 첫번째 수로 어떤 값을 넣느냐에 따라 두번째 수로 넣는 값이 달라진다.
그런데 정답은 하나로 충분하니까 나는 여기서 마치겠다!
벌써 절반이다 오예!
'CSE > 시스템프로그래밍' 카테고리의 다른 글
[BombLab] phase_5 해설 (1) | 2024.09.10 |
---|---|
[BombLab] phase_4 해설 (0) | 2024.09.09 |
[BombLab] phase_2 해설 (0) | 2024.09.02 |
[BombLab] phase_1 해설 (0) | 2024.09.02 |
[BombLab] 환경설정 & 어셈블리어 (0) | 2024.09.01 |