Write-ups/pwnable.xyz

note - pwnable.xyz

dolphinlmg 2020. 2. 11. 23:29

Prob Info


Prob Info
Checksec

int __cdecl main(int argc, const char **argv, const char **envp)
{
  const char *v3; // rdi
  int v4; // eax

  setup();
  v3 = "Note taking 101.";
  puts("Note taking 101.");
  while ( 1 )
  {
    while ( 1 )
    {
      while ( 1 )
      {
        print_menu();
        v4 = read_int32(v3);
        if ( v4 != 1 )
          break;
        edit_note();
      }
      if ( v4 != 2 )
        break;
      edit_desc();
    }
    if ( !v4 )
      break;
    v3 = "Invalid";
    puts("Invalid");
  }
  return 0;
}

 

 

void edit_note()
{
      int v0; // ST04_4
      void *buf; // ST08_8
    
      printf("Note len? ");
      v0 = read_int32("Note len? ");
      buf = malloc(v0);
      printf("note: ");
      read(0, buf, v0);
      strncpy(s, (const char *)buf, v0);
      free(buf);
}
.bss:0000000000601480                 public s
.bss:0000000000601480 ; char s[32]
.bss:0000000000601480 s               db 20h dup(?)           ; DATA XREF: edit_note+67↑o
.bss:00000000006014A0 ; void *buf
.bss:00000000006014A0 buf             dq ?                    ; DATA XREF: edit_desc+4↑r
.bss:00000000006014A0                                         ; edit_desc+1A↑w ...

힙에 입력한 길이만큼 문자를 받고 s에 strncpy를 이용해 값을 복사한다. 여기서 최대로 복사할 수 있는 값을 우리가 정할 수 있기 때문에 s에서 bof가 일어난다.

 

ssize_t edit_desc()
{
      if ( !buf )
        buf = malloc(0x20uLL);
      printf("desc: ");
      return read(0, buf, 0x20uLL);
}

edit_desc에서는 buf가 0이 아니면 그 주소에 값을 쓸 수 있는데 buf는 우리가 값으로 수정할 수 있으므로 GOT Overwrite가 가능하다.