문제는 Password를 원하고 있다.
Die로 열어본다.
특이 사항은 보이지 않는다.
프로그램을 실행시켜 본다.
문제에서의 Password는 이것을 원하는 것 같고, Password를 알려면 Username까지 알아야 할 것이다.
디버거로 열어본다.
실패 했을 때의 문자열을 통해 성공과 실패로 가는 분기를 찾았다.
test bl, bl 구문과, cmp 구문을 통과해야 실패로 점프를 뛰지 않고 성공을 출력 하는 것 같다.
일단 test bl, bl을 먼저 보자면
이 구문은 bl과 bl을 and연산 하는 구문이지만, 실제 뜻은 bl이 0인지 아닌지를 판단하고 0이라면 ZF를 세팅하는 구문이다.
그럼 bl은 0이면 안되기 때문에 bl의 값을 건드리는 부분을 위로 올라가며 찾아보도록 하자
위로 올라가보면, 프로그램의 모든 원리를 알 수 있는데 찾았던부분부터 보게되면
sete명령어로 bl을 조작하는 구문이 보이고, 그 아래에는 내가 Password에 입력한 값과 특정 값을 비교하는 구문이 보였다.
Password는 0x88228F로 예상하고 페이지에 인증하니 실제로 통과가 되었다 하지만 여기서 멈추지 않고, 성공 구문으로 갈 수 있는 Username과 Password를 찾아보겠다.
함수의 맨 처음부터 보게되면,
입력한 username의 맨 앞자리를 가져와 0x0하고 비교하는 구문이 있다.
만약 다르다면 sbb구문으로 점프를 하게 된다.
username의 맨 앞자리를 덤프 탭에서 0x0을 추가해주고 password는 아까 찾았던 것으로 넣고 실행시켜본다.
0x0이 삽입되어 있지 않다면, cmp구문으로 비교하면 다른 값이기 때문에 ZF가 0이 되고 sbb로 점프하게 되며, ZF를 세팅하는 구문이 더이상 없게 된다.
하지만
0x0이 삽입되어 있다면 xor eax,eax구문으로 점프를 하게 되고, 아래 jmp구문으로 sbb구문을 건너 뛰게 해준다.
ZF는 설정하는 구문이 없으니 계속 1로 세팅이 되어있을 것이고, 아래의 test bl, bl구문을 통과할 수 있게 된다.
이렇게 프로그램을 전부 실행하게 되면,
username의 실제 값이 무엇이던, 맨 앞에 0x0의 값만 있으면 이렇게 성공 문자열을 출력 해주게 된다.
성공!
'Reversing 문제 풀이 > CodeEngn.com_Advance' 카테고리의 다른 글
codeengn-advance-L08 풀이 (0) | 2022.05.12 |
---|---|
codeengn-advance-L07 풀이 (0) | 2022.05.11 |
codeengn-advance-L06 풀이 (2) | 2022.05.09 |
codeengn-advance-L05 풀이 (0) | 2022.05.06 |
codeengn-advance-L04 풀이 (0) | 2022.05.04 |
최근댓글