
password를 입력받고 있음
password를 체크하는 함수에 envp라는 변수가 넘어가고 있는 것을 확인
이전함수로 돌아가서 envp 추적

_p__environ()을 이용해 읽어온 변수를 v1에 넣는 것을 확인할 수 있음

동적 디버깅을 이용해 _p__environ() 로 환경변수를 읽어옴을 알 수 있음

입력한 비밀번호를 한글자씩 읽어와서 정수형태로 읽어와 모두 더한다.
그 합이 16이라면 check2 함수로 넘어감 -> 비밀번호의 합은 16

check_flag 값이 1이 되면 ok 출력

환경변수에서 "LOL"로 시작하는 환경변수가 있으면 check_flag 함수를 1로 선언.
즉, 환경변수를 "LOL~"로 선언하고 비밀번호의 각 자리의 합을 16으로 설정하면 성공


"r0b0RUlez!" 문자열을 이용해 level1 pass

level2

level1 전에 위에서 선언된 암호화된 문자열들을 외부 모듈을 이용하여 복호화하는 것 같다.

puts를 출력할 때 Buffer에 성공에 해당하는 문자열이 있을거라 판단
입력한 비밀번호와 위에서 말한 모듈로 복호화된 문자열을 xor_password 함수로 파싱

복호화된 문자열을 2로 xor 한 문자열이 올바른 password
한글자씩 읽다가 다음 복호화된 값이 0x02라면 종료

우리는 ida로 암호화된 문자열만 알고있으므로 복호화 루틴을 알아야 한다.

하지만 동적디버깅으로 바로 복호화된 문자("u1nnf2lg") 확인

xor 연산으로 password 확인

64bit, ELF

그냥 실행하면 아무것도 일어나지 않는다.

플래그라는 파일이 존재하지 않으면 exit 하는 것을 확인

flag 생성 후 실행가능

v11 : 플래그의 길이
v7 : read의 리턴값(플래그 입력받는 read) -> 읽어오는 바이트 수
v10 : 입력받는 플래그
즉, 플래그 파일과 입력하는 플래그가 같으면 성공


그림을 그리고 check를 누르면 결과 출력

wrong 텍스트를 기준으로 코드 확인
v13의 값을 비교하는데 90000번 동일해야 함을 알 수 있음. 동일하지 않으면 wrong 출력
따라서 v13에서 비교하고 있는 값을 확인

동적디버깅으로 확인해보니 0xff와 다른 값으로 이루어진 것이 90000개 있는 것을 확인 -> 해당 데이터와 사용자가 그린 그림을 비교한다는 것다고 판단
해당 파일은 비트맵 형식으로 이루어져 있기 때문에 비트맵 양식을 준비한 후 헥스 에디터로 코드에서 덤프한 값을 덮어씌어주면 플래그 획득
