이문제 역시 어떤 값을 넣었을때 correct,wrong이 나오는 문제다.

main함수 부분을 찾으면 역시 eax값이 0이면 wrong을 출력해서 eax값이 0이 나오면 안된다.

correct인지 wrong인지 확인하는 부분을 자세히 보면

rsp는 인덱스 역할을 하고

rsp+20은 사용자가 임력한 값이다.

cmp,jae로 올바른 문자열을 입력했을때 0x14번 문자열을 출력하고 아니면 0x15에 eax=1을 리턴해서 correct를 반환한다.

블로그를 참고해 분석결과를 적어보면

AND 0XFF는 user[idx]와 0xFB를 한 값이 0x100~0xFF일 경우에 하위 2비트만 추출해 그 값이 prog[]값과 일치하는 지 빅하는 것이다.

user[idx]=user[idx]*0xFB

user[idx] AND 0xFF

이런 순서로 프로그램이 진행되어 사용자가 입력하는 값을 찾기위해서는 반대로 연산하면 된다.

user[idx] AND 0xFF

user[idx]=user[idx]*0xFB

(위에 두줄이 아직 이해는 안됨.....일단 마저 설명을 정리하면)

AND와 0xFF는 나머지 연산인 %256치환될수 있다. 그 이유는 256을 1 0000 0000로 나눈 값의 나머지를 의미하는데 이 값은 하위 2비트만 남도록 한다고 한다.

그래서 251*user[i] = prog[i]%256이 된다.--> 현재 251은 256으로 나눴을때 0이 되어 값을 사용할 수 없다. 256으로 나눠서 나머지가 1이 나오도록 해야 된다.

251*51*user[i]=prog[i]*51%256 --> 12801*user[i] = prog[i]*51%256-->user[i]=prog[i]*51%256이 나온다.....

 

이번 문제는 위에껄 이해하면 코드는 짤수 있을꺼같은데 위에껄 더 공부해야 할듯 싶다.......

'보안 > 리버싱' 카테고리의 다른 글

LAB 6-3 실습  (0) 2021.11.20
[리버싱] DLL Injection, DLL Ejection 코드  (0) 2021.11.13
[리버싱] 드림핵 rev-basic-7 풀이  (0) 2021.11.13
IAT, EAT 로딩 과정  (0) 2021.10.02
[리버싱] 드림핵 rev-basic-6 풀이  (0) 2021.10.02

+ Recent posts