reversing
dreamhack CTF div2에 나온 리버싱 문제다 재밌어보여서 풀었다
ida로 열어본 디스어셈블 코드다
코드를 살펴보면 fall asleep from now on.
이라는 문구가 나온 후
랜덤한 숫자로 sleep에 들어가게 된다
이 문제를 실행해보면 알겠지만 sleep이 끝날생각을 안한다;;
그래서 첫번째로 이 sleep을 건너뛰는것이 디버깅의 첫번째 목표다
두번째 목표는 if문을 통과하는 것인데 문제에서는 입력을 한번만 받지만
if문에서는 서로 다른 rand값으로 조건문을 검사한다
디버깅을 통해 이 값들을 바꿔주어서 조건문을 통과하는것이 두번째 목표다
이부분이 rand값으로 sleep에 들어가는 부분이다
여기서 edi값을 1로 바꾼다면 1초만 sleep하고 넘어가게 바뀔 것이다
해당 부분에 브레이크 포인트를 걸어주고 프로그램을 실행시켜보자
eax값을 edi인자로 넘겨주니 eax를 1로 바꿔준 후 실행하면 sleep을 1초만 하고 넘어간다
첫번째 목표를 성공했으니 다음으로 넘어가자
변수 설정값을 보면 여기가 첫번째 if문임을 알 수 있다
해당 부분에 브레이크 포인트를 걸고 조건값을 확인해보자
jne를 하기 전에 ecx와 cmp를 하는데 그 값이 5임을 알 수 있다
그러면 처음 문자를 입력할 땐 5를 입력해 주자
그러면 이렇게 앞부분 플래그가 출력된다
두번째 조건문은 5가 아니라서 플래그 생성이 안되는것 같다
이제 두번째 조건문을 수정해보자
여기도 역시 변수값을 비교해 보면 두번째 조건문임을 알 수 있다
해당 부분에 브레이크 포인트를 걸고 확인해보자
아까 조건문과 똑같이 rcx값을 확인해보니 3이란 값이 존재한다
그러면 조건문은 3을 만족해야 하므로 3으로 수정해주고 실행시켜보자
이젠 완전한 플래그를 얻었다