study writeup week1

ripemo·2025년 2월 12일

IOLI Crackme 0x04

  • password를 체킹하는 프로그램
  • 핵심 루틴

0x00401310

  • [ebp-0x8] : 이전 인덱스의 값과 현재 인덱스의 값의 합을 저장할 변수 선언
  • [ebp-0xC] : 반복문을 체크하기 위한 비밀번호 인덱스 변수 선언

0x00401324

  • [ebp+0x8] : 사용자가 입력한 비밀번호 저장
  • 입력한 비밀번호를 strlen 하기 위해 esp로 옮긴 후 call
  • 입력한 비밀번호의 길이와 비밀번호 인덱스를 비교
    -> 현재 비밀번호 인덱스가 비밀번호 길이보다 크면 0x401387로 jump
    -> 0x401387은 "Password incorrect"를 출력 후 종료

0x00401334

  • [ebp-0xC](인덱스 변수)를 eax에 저장 후 입력한 비밀번호의 주소를 더한다.
    -> 입력한 비밀번호의 인덱스를 돌면서 한 바이트(한 글자)씩 읽기 위함
  • 입력한 비밀번호의 현재 인덱스의 값을 [ebp-0xD]에 저장
  • 그 후 sscanf를 이용하여 [ebp-0x4]에 [ebp-0xD]에 있는 비밀번호의 현재 인덱스 값 저장
  • 위 값을 edx에 저장하고 이전 값들의 합 변수 주소를 eax에 저장 후 합하여 0xF(15)와 비교
  • 같다면 0x00401368로 이동하여 "Passwrod OK" 출력 후 종료
  • 다르다면 0x00401380 으로 이동하여 [ebp-0xC]의 값 inc 하고 [0x00401324]로 jump 후 모든 인덱스 반복
결과적으로 비밀번호의 모든 인덱스를 돌면서 해당 값들의 합이 15가 된다면 ok를 출력. 비밀번호 길이만큼 다 돌지 않더라도 합이 15가 된다면 출력하고 종료

IOLI Crackme 0x07

  • 동일하게 패스워드 체킹하는 프로그램

0x00401439

  • 로직은 이전 문제와 동일. 대신 합이 0x10(16)이 되어야 함
  • 그 후 0x0040139E로 이동

0x0040139E

  • 여기서 [ebp+0xC]에 있는 값을 0x401310 함수로 보냄
  • 이 함수의 return 값이 0이 아닐 때 test eax,eax 의 값이 0이 아니기 때문에 진행 가능

0x401310

  • [ebp-0x4]를 이용하여 4의 배수만큼 인덱스를 이동함

  • [ebp+0xC]에 있는 주소를 가져와 4만큼 더하면서 문자열들을 모두 반복
    -> 그때 그 문자열과 "LOLO" 라는 문자열을 3으로 strncmp했을 때 1이 return 됨
    -> 즉 문자열들 중 앞 세자리가 "LOL"인 문자열이 있어야 함

  • 저장된 문자열

  • 다음과 같은 문자들이 있는데 이는 환경변수들이다

  • set 으로 출력한 환경변수

  • 즉 환경변수를 추가한 후 합을 16으로 맞춰주면 성공
    -> 환경변수를 설정하기 위해 cmd에서 set LOL=hehe 를 이용해 환경변수 설정
    -> 환경변수 설정을 위해 a=b의 형식이어야 하고, 키 값은 앞 세자리만 "LOL" 이고 나머지는 상관없음

exploit

  • 환경변수 설정 전

  • 환경변수 설정 후

  • 실제로 들어간 데이터를 확인하기 위해 cmd에서 실행 후 x32dbg로 attach

    • 입력한 환경변수가 들어간 것을 확인

crackme_easy

  • 패스워드 크랙

  • 입력받은 password와 0xF7319c에 있는 문자열을 비교하여 동일하면 login

crackme 10

  • 패스워드 크랙

  • 안티디버깅 존재

    • 해당 부분을 mov eax,0으로 패치하여 안티디버깅 우회

0x0040114A

  • 사용자가 입력한 비밀번호의 길이를 0xE(14)와 비교. 즉 비밀번호의 길이는 14 이어야 함

0x00401167

  • 0x4031A4 위치에 "VaZoNeZ"라는 문자열 복사하고 해당 위치에 strcat 실행
    -> 즉 0x4031A4 위치부터 "VaZoNeZVaZoNeZ" 저장
  • GetUserNameA를 이용해 현재 돌아가는 운영체제의 유저이름을 가져옴

0x00401199

  • 입력한 비밀번호와 username을 이용하여 비밀번호를 한 바이트씩 돌면서 0x004011AD의 과정 거침

    • username의 첫글자를 이용해 암호화 과정 거침
  • 입력한 비밀번호와 암호화된 문자열을 비교해서 모두 같으면 성공

Rewrit's crackme#1

  • 패스워드 크랙

  • 사용자에게 입력받은 비밀번호를 0x7E97E56C와 비교

  • 비밀번호를 123으로 입력했을 때

    값이 0x7B(123) 인것을 확인
    -> 즉 십진수 123으로 들어가는 것을 확인할 수 있음

  • 따라서 0x7E97E56C 를 10진수로 변환한 값을 비밀번호로 입력해야 함

profile
hackyFrog

0개의 댓글